批量名片识别解决方案

本文涉及的产品
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
可观测可视化 Grafana 版,10个用户账号 1个月
可观测监控 Prometheus 版,每月50GB免费额度
简介: 批量对名片图片进行识别,并保存在数据库中,识别完成后并完成消息通知

场景

用户在参加展会时会互相交换名片,这些名片后续需要录入到系统中,作为一个客户或者供应商存在。如果使用人工手动输入上传会比较耗时,因而需要一个将名片拍照后进行批量识别并直接导入到系统的功能。

解决思路

1、文件上传

拍好的名片照片需要进行上传,可以通过单张上传或者打成压缩包上传。若采用单张上传,那么文件的上传需要做成支持多选的功能,这样的话就会面临需要上传的文件会有几千张,如果做多选的话,我们的上传控件为了考虑性能问题,一定会做选择文件个数的限制,这样就会导致用户需要频繁操作,同时可能会造成很多的请求。鉴于以上原因此处选择压缩包分片上传,防止单个压缩包过大导致上传失败。

在技术上,此处选择阿里云的 对象存储OSS 来处理打包文件的分片上传,以下为主要代码:

📎aliyun-oss-sdk-5.3.1.min.js📎es6-promise.min.js📎md5.js📎uploadFile.js

<!DOCTYPE html><html><head><title></title><scripttype="text/javascript"src="/aliyun-oss-sdk-5.3.1.min.js"></script><scripttype="text/javascript"src="/es6-promise.min.js"></script><scripttype="text/javascript"src="/jSignature/md5.js"></script><scripttype="text/javascript"src="/mumu.file.js"></script></head><body><inputtype="file"name="file"title="上传文件"text="上传文件"allowexts="zip"onchange=""><p><buttontype="button"name="uploadFile"class="hide">上传文件</button></p><scripttype="text/javascript">varmyFiles= [];
varsaveFileUrl="/add/upload/file/url";//上传文件成功后回调url//设置OSS上传的ststoken信息MyFile.stsTokenObj= {
region: "oss-cn-qingdao",//替换你的bucket所在的区域accessKeyId: "your-AccessKeyId",//替换为你的accesskeyaccessKeySecret: "your-AccessKeySecret",//替换为你的accesskeySeceretstsToken: "your-sts-Token",//替换为你的ststokenbucket:"your-bucket-name",//替换为你的bucket那么secure:true };
//设置文件上传的路径MyFile.uploadFilePath="/my/file/path/";
//设置文件控件的变化$("body").delegate("input[type=file]", "change", function () {
//上传文件时或者更换文件时,可进行文件类型、文件大小的验证for (vari=0; i<this.files.length; i++) {
myFiles.push(this.files[i]);
        }
    });
//上传文件$("button[name=uploadFile]").click(function () {
$(this).attr("disabled", "disabled");
letcurButton=$(this);
varupLoadedCount=0;
varfileUploadPromise= (file, index) => {//执行上传letpromise=newPromise((resolve, reject) => {
varcallback=function (res) {
varform=newFormData();
form.append("file", res.name);//上传文件后在oss的文件路径form.append("originName", res.originName);//上传的文件的本地名称$.ajax({
type: "post",
url: saveFileUrl,//上传文件成功后回调地址data: form,
processData: false,
contentType: false,
success: function (res) {
curButton.removeAttr("disabled");
if (res.success) {
alert("上传成功");
                            }
else{
alert("上传失败");     
                            }
                        },
error: function (res) {
curButton.removeAttr("disabled");   
alert("上传失败");
                        }
                    });
                };
varuploadProgress=function (p) {
console.log(p);
returnfunction (done) {
done();
                    }
                };
MyFile.applyTokenDo(MyFile.uploadFile, file, callback, uploadProgress);
            });
returnpromise;
        };
varhandleFiles= (files) => {
letfilesPromise=files.map((file, index) =>fileUploadPromise(file, index));
Promise.all(filesPromise)
            .then(data=> {
data.map((image, index) =>console.log("success"))
            })
        };
handleFiles(myFiles);
    });
</script></body></html>


这里分片上传文件到 OSS 使用了 OSS 的官方sdk,大家可参考阿里云官网上的 OSS SDK下载最新的开发包。上传时的 AccessKey 和 AccessSecret 为使用 STS 方式获取的临时 token,这样可以保证原密钥的安全性。这里就不再说明了。

2、保存文件数据、发送队列

在文件上传成功后,可将上传的文件信息保存到数据库中,比如,可设计一个文件记录表:

CREATETABLE `tbfile` (  `id` int(11)unsignedNOTNULL AUTO_INCREMENT,  `file_path` varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '文件路径',  `createtime` datetime DEFAULT NULL COMMENT '上传时间',  `origin_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '原始名',  PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='上传文件';


考虑到图片识别的速度会很慢,如果立即识别可能会导致用户的浏览器连接超时,当压缩包上传成功后,此处使用异步发送 MQ 的方式进行名片识别。

将刚插入数据库的数据 ID 作为消息体发送,可使用 ActiveMQ、Rocket MQ、Alimns等消息队列处理。

3、接收队列、进行识别

在服务端新建一个 Service 进行队列接收,并根据消息内容从第二步的数据表中获取上传文件的 OSS 地址,将该压缩包下载解压后,依次识别每个名片信息。识别成功后可将识别的数据插入到目标数据表,并同时通过企业微信、钉钉、短信等通知上传用户。

名片的识别可使用阿里云 视觉智能开放平台>文字识别>名片识别 或者 其他名片识别。此处以 Laravel 框架展示主要代码内容:

/*** 处理名片信息
*@paramfileUrl 压缩文件的下载地址
*/privatefunctiondealCardInfo($fileUrl){
//下载文件
$filePath=storage_path('downloads/mycards.zip');
$downloadFile=file_get_contents("compress.zlib://".$fileUrl);
file_put_contents($filePath, $downloadFile);
//解压文件
shell_exec("unzip -d ".storage_path("downloads/mycards/").' -o '.$filePath);
//循环文件
$allFiles= \Storage::disk('download')->allFiles("mycards/");
foreach ($allFilesas$curFile) {
$curImagePath=storage_path("downloads/".$curFile);
$curImage=base64_encode(file_get_contents($curImagePath));
$ret=$this->getCardInfo($curImage);
if (!empty($ret)) {
$curContent= [
"name"=>$ret["name"],
"company"=>$ret["company"],
"department"=>$ret["department"],
"title"=>$ret["title"],
"tel_cell"=>$ret["tel_cell"],
"tel_work"=>$ret["tel_work"],
"addr"=>$ret["addr"],
"email"=>$ret["email"]
        ];
app("db")->connection("mysql")->table("tbcontact")->insert($curContent);
    }
//删除文件
unlink($curImagePath);
  }
//发送消息提醒
#todo//删除下载文件
unlink($filePath);
}
/*** 识别名片
*@paramimageInfo 图片base64 或者图片url*/privatefunctiongetCardInfo($imageInfo){
$url="https://bizcard.market.alicloudapi.com/rest/160601/ocr/ocr_business_card.json";
$method="POST";
$appcode="your app code";
$headers= [
"Authorization:APPCODE ".$appcode,
"Content-Type".":"."application/json; charset=UTF-8"    ];
//图片二进制数据的base64编码或者图片url$bodys="{\"image\":\"".$imageInfo."\"}";
$ret="";
try {
$curl=curl_init();
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_FAILONERROR, false);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, false);        
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($curl, CURLOPT_POSTFIELDS, $bodys);
$ret=curl_exec($curl);
curl_close($curl);
  } catch(\Exception$ex){
  }
$retArr=json_decode($ret,true);
if (empty($retArr)) {
return [];
  }
if (!$retArr["success"]) {
return [];
 }
return$retArr;
}


相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
25天前
|
自然语言处理 数据可视化 前端开发
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
合合信息的智能文档处理“百宝箱”涵盖文档解析、向量化模型、测评工具等,解决了复杂文档解析、大模型问答幻觉、文档解析效果评估、知识库搭建、多语言文档翻译等问题。通过可视化解析工具 TextIn ParseX、向量化模型 acge-embedding 和文档解析测评工具 markdown_tester,百宝箱提升了文档处理的效率和精确度,适用于多种文档格式和语言环境,助力企业实现高效的信息管理和业务支持。
3984 5
从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】
|
3月前
|
文字识别 算法 API
视觉智能开放平台产品使用合集之是否支持对敏感内容进行马赛克处理
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
|
5月前
|
文字识别 安全 网络安全
印刷文字识别产品使用合集之一般包含什么信息, 会被认为敏感信息
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
5月前
|
机器学习/深度学习 文字识别 算法
视觉智能开放平台产品使用合集之文字敏感内容识别和文字违禁内容识别有什么区别
视觉智能开放平台是指提供一系列基于视觉识别技术的API和服务的平台,这些服务通常包括图像识别、人脸识别、物体检测、文字识别、场景理解等。企业或开发者可以通过调用这些API,快速将视觉智能功能集成到自己的应用或服务中,而无需从零开始研发相关算法和技术。以下是一些常见的视觉智能开放平台产品及其应用场景的概览。
|
6月前
|
文字识别 开发工具 数据安全/隐私保护
印刷文字识别产品使用合集之教育场景识别,是否支持以Word文档的形式批量导入题目呢
印刷文字识别(Optical Character Recognition, OCR)技术能够将图片、扫描文档或 PDF 中的印刷文字转化为可编辑和可搜索的数据。这项技术广泛应用于多个领域,以提高工作效率、促进信息数字化。以下是一些印刷文字识别产品使用的典型场景合集。
|
6月前
|
消息中间件 JavaScript Java
MQ产品使用合集之视觉智能平台人脸搜索1:N怎么更新人脸数据
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
6月前
|
文字识别
印刷文字识别产品使用合集之在自定义模板中,时间总是被错误地识别如何解决
印刷文字识别(Optical Character Recognition, OCR)技术能够将图片、扫描文档或 PDF 中的印刷文字转化为可编辑和可搜索的数据。这项技术广泛应用于多个领域,以提高工作效率、促进信息数字化。以下是一些印刷文字识别产品使用的典型场景合集。
|
6月前
|
JSON 文字识别 数据可视化
印刷文字识别产品使用合集之有识别二维码并将识别二维码的内容通过接口返回的功能吗
印刷文字识别(Optical Character Recognition, OCR)技术能够将图片、扫描文档或 PDF 中的印刷文字转化为可编辑和可搜索的数据。这项技术广泛应用于多个领域,以提高工作效率、促进信息数字化。以下是一些印刷文字识别产品使用的典型场景合集。
|
6月前
|
机器学习/深度学习 API 计算机视觉
视觉智能平台常见问题之用到人脸1:1加上活体需要单独收费如何解决
视觉智能平台是利用机器学习和图像处理技术,提供图像识别、视频分析等智能视觉服务的平台;本合集针对该平台在使用中遇到的常见问题进行了收集和解答,以帮助开发者和企业用户在整合和部署视觉智能解决方案时,能够更快地定位问题并找到有效的解决策略。
|
6月前
|
机器学习/深度学习 算法 iOS开发
视觉智能平台常见问题之使用人脸及身份证采集如何解决
视觉智能平台是利用机器学习和图像处理技术,提供图像识别、视频分析等智能视觉服务的平台;本合集针对该平台在使用中遇到的常见问题进行了收集和解答,以帮助开发者和企业用户在整合和部署视觉智能解决方案时,能够更快地定位问题并找到有效的解决策略。