云原生社区 > 正文

批量名片识别解决方案

简介: 批量对名片图片进行识别,并保存在数据库中,识别完成后并完成消息通知
+关注继续查看

场景

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

解决思路

image

1、文件上传

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

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

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

<!DOCTYPE html>
<html>
<head>
 <title></title>
 <script type="text/javascript" src="/aliyun-oss-sdk-5.3.1.min.js"></script>
 <script type="text/javascript" src="/es6-promise.min.js"></script>
 <script type="text/javascript" src="/jSignature/md5.js"></script>
 <script type="text/javascript" src="/mumu.file.js"></script>
</head>
<body>
<input type="file" name="file" title="上传文件" text="上传文件" allowexts="zip" onchange="">
<p><button type="button" name="uploadFile" class="hide">上传文件</button></p>
<script type="text/javascript">
 var myFiles = [];
  var saveFileUrl = "/add/upload/file/url";//上传文件成功后回调url
 //设置OSS上传的ststoken信息
 MyFile.stsTokenObj = {
    region: "oss-cn-qingdao",//替换你的bucket所在的区域
    accessKeyId: "your-AccessKeyId",//替换为你的accesskey
    accessKeySecret: "your-AccessKeySecret",//替换为你的accesskeySeceret
    stsToken: "your-sts-Token",//替换为你的ststoken
    bucket:"your-bucket-name",//替换为你的bucket那么
    secure:true
 };
 //设置文件上传的路径
 MyFile.uploadFilePath = "/my/file/path/";
 //设置文件控件的变化
    $("body").delegate("input[type=file]", "change", function () {
        //上传文件时或者更换文件时,可进行文件类型、文件大小的验证
        for (var i = 0; i < this.files.length; i++) {
            myFiles.push(this.files[i]);
        }
    });
    //上传文件
    $("button[name=uploadFile]").click(function () {
        $(this).attr("disabled", "disabled");
        
        let curButton = $(this);
        var upLoadedCount = 0;
        var fileUploadPromise = (file, index) => {//执行上传
            let promise = new Promise((resolve, reject) => {
                var callback = function (res) {
                    var form = new FormData();
                    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("上传失败");
                        }
                    });
                };
                var uploadProgress = function (p) {
                 console.log(p);
                    return function (done) {
                        done();
                    }
                };
                MyFile.applyTokenDo(MyFile.uploadFile, file, callback, uploadProgress);
            });
            return promise;
        };
        var handleFiles = (files) => {
            let filesPromise = 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、保存文件数据、发送队列

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

CREATE TABLE `tbfile` (
  `id` int(11) unsigned NOT NULL 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='上传文件'
;


image

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

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

3、接收队列、进行识别

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

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

/**
* 处理名片信息
* @param fileUrl 压缩文件的下载地址
*/
private function dealCardInfo($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 ($allFiles as $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);
}
/**
* 识别名片
* @param imageInfo 图片base64 或者图片url
*/
private function getCardInfo($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;
}


版权声明:本文内容由便宜云服务器实名注册用户自发贡献,版权归原作者所有,便宜云服务器开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《便宜云服务器开发者社区用户服务协议》和《便宜云服务器开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
批量提取某音视频文案(二)
介绍批量提取视频文案的流程, 以及做视频的步骤
19 0
身份证OCR接口:提高录入效率+识别信息造假
现在的身份证登记多采用人工录入方式,这样做不仅费时而且效率很低。如何利用新兴的身份证OCR接口证件识别技术,快速、高效、完整地录入证件信息,并对其进行相应的管控与核验,已成为许多信息系统亟待解决的问题。
18 0
OCR技术大揭秘:纸质文档数字化的新选择
随着数字化和信息化的快速发展,OCR 技术逐渐成为处理大量纸质或电子文档的主要手段之一,具有广泛的应用前景。 本文将从OCR 技术的关键技术点、应用、优缺点以及推荐优秀的应用API 等角度给大家讲述OCR 相关的内容。
42 0
产品信息二维码应用方案
为每一类产品生成一个二维码,用于展示文字、图片、音视频等产品信息。将二维码印刷在产品外包装、画册、样品卡或说明书上,用户通过微信扫码就能查看图文并茂的产品介绍、操作教程,并获取售后服务。
49 0
视觉智能开放平台【人脸人体】类目上线了包含人脸比对1:N在内的9个算法,重点还免费,快来看看吧!
尊敬的开发者您好,感谢您对便宜云服务器视觉智能平台的支持,近期平台在【人脸人体】大类下上线了9个视觉AI算法,分别是人脸比对1:N、人体姿势关键点、手姿势关键点、人脸美妆、人脸美型、行人检测、人脸修复增强以及人脸滤镜,接下来给您逐一介绍下。
1055 0
智能云相册应用场景包含哪些设备?
智能云相册可应用在各种包含照片、视频的存储设备中,如移动设备、家庭存储设备等。不仅适用于企业用户开发自己的相册APP产品,也适用于个人开发者将智能云相册服务集成在自己的私有云,以实现对存储设备上的影像文件进行智能管理。
1164 0
前端代码是怎样智能生成的-表单表格专项识别篇
作为阿里经济体前端委员会四大技术方向之一,前端智能化项目经历了2019双十一的阶段性考验,交出了不错的答卷,天猫淘宝双十一会场新增模块79.34%的线上代码由前端智能化项目自动生成。在此期间研发小组经历了许多困难与思考,本次《前端代码是怎样智能生成的》系列分享,将与大家分享前端智能化项目中技术与思考的点点滴滴。
997 0
OCR:实现信息结构化提取 助力信息数字化管理 ——基于OCR的机动车销售统一发票识别提取自动化应用案例
为降低信息提取成本、优化业务处理效率,深源恒际依托自身在OCR技术上的积累,打造了机动车销售统一发票信息识别提取自动化解决方案,自动检测、识别、提取发票信息,并根据实际应用需求输出结构化文本,由计算机替代人工作业,高效、准确地完成信息提取。
4827 0
征信报告OCR:结构化提取信息 加速信贷业务审批
OCR技术在信贷业务中的应用,实现了征信报告识别录入自动化,优化业务流程的同时,也提升了业务处理效率,让信贷服务能够更加高效、便捷地触达用户。
2691 0
便宜云服务器拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。
+关注
我是小七
问题总能找到解决方案的
文章
问答
视频
相关电子书
更多
多轮对话智能办公“我说你做”—构建企业任务驱动智能平台
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
http://www.vxiaotou.com