人工智能OCR识别平台翔云等介绍及编程实现调库人脸识别_第1页
人工智能OCR识别平台翔云等介绍及编程实现调库人脸识别_第2页
人工智能OCR识别平台翔云等介绍及编程实现调库人脸识别_第3页
人工智能OCR识别平台翔云等介绍及编程实现调库人脸识别_第4页
人工智能OCR识别平台翔云等介绍及编程实现调库人脸识别_第5页
已阅读5页,还剩4页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

⼈⼯智能OCR识别平台翔云等介绍及编程实现调库⼈脸识别师承陈⽴⾂⽬录README本篇章是学习过程的记录,为问题导向⽅式(即通过出现问题引导⼀步步解决)。这样虽然是⿇烦了点,但是对知识,对可能出现的错误的理解会提⾼⼀个档次。要有前⾯篇章的基础,不然就不知道在说啥了:注意:这⾥使⽤的平台是Ubuntu,树莓派的⼀定要跟着这篇⽂章来,不然等着折腾吧:为什么要学会调库?百度搜索OCR识别,可以发现有很多⼤⼚都在做这个项⽬,⽐如百度OCR,腾讯OCR,科⼤讯飞OCR等等。国内中⼩型公司,甚⾄是⼤公司在做项⽬时希望能够快速占领市场,⽐如⼈脸识别,车牌识别需要⾮常稳定的算法,如果需要本公司研发部的研发⼈员去做,可能要包含两个硕⼠⼀个博⼠还有⼏个本科⽣⼀同做研发,⽣产周期以及稳定性都是⾯临了巨⼤的挑战。这时候,购买别⼈已经做好的⽅案,是⾮常划算的。有个很好的例⼦,oppo⼿机vivo⼿机,未来要上5G,就得和华为合作,就是类似的原理。不是说他们搞不出来5G来,给他们时间肯定也搞得出来,但搞出来的时候已经晚了。下⾯通过⼈⼯智能OCR识别平台的使⽤,掌握调库调API开发的⼀般步骤,其他的平台也基本类似。OCR识别平台翔云导读注册登录先看到【价格与购买】在【产品】,看看⼈⼈脸识别的API⽂档再看到【开发者中⼼】点击图标下载看看能提供什么样⼦的案例读⼀下这个C++⽰例代码读取⽂档,捕捉类似这样的关键信息,⼀般注释都写得很清楚1strPostData.Format(_T("img=%s&key=%s&secret=%s&typeId=%d&format=xml"),strImageBase64,strKey,strSecret,nTypeID);虽然是C++写的,到最后也可以⽤C语⾔做出来来看看java的代码java⼤多直接调库,⾮常简洁,这也是它开发效率⾼的原因之⼀。在【个⼈中⼼】可以看到⾃⼰的OCRkey和密码,这两句在代码中肯定要⽤上来访问OCR平台。购买⼈脸识别体验版吧。编程实现调库⼈脸识别调试程序:打通OCR后台第⼀版调试,最终程序是⼀步步改进得来的,想看最终程序的建议跳转。程序⼤意:测试打通OCR后台,查看后台返回的数据12#include<stdio.h>#include<curl/curl.h>#include<string.h>#include<stdlib.h>3456typedefunsignedintbool;//数据类型别名⽤typedef7#definetrue1#definefalse0//宏定义⽤define8910111213141516171819202122232425262728293031323334353637383940414243444546474849505152//回调函数,读取从OCR后台返回的数据size_treadData(void*ptr,size_tsize,size_tnmemb,void*stream){charbuf[1024]={'\0'};strncpy(buf,ptr,1024);printf("===========getdata===========\n");printf("%s\n",buf);}boolpostUrl(){//根据⽂档,接⼝调⽤⽅法为post请求CURL*curl;CURLcoderes;char*postString;//分开定义,然后字符串拼接char*img1=NULL;char*img2=NULL;char*key="xxx";char*secret="xxx";inttypeId=21;char*format="xml";postString=(char*)malloc(strlen(key)+strlen(secret)+2048);sprintf(postString,"img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s","","",key,secret,typeId,format);curl=curl_easy_init();if(curl){curl_easy_setopt(curl,CURLOPT_COOKIEFILE,"/tmp/cookie.txt");//指定cookie⽂件curl_easy_setopt(curl,CURLOPT_POSTFIELDS,postString);//指定post内容curl_easy_setopt(curl,CURLOPT_URL,"/api/faceliu.do");//指定urlcurl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,readData);//回调函数读取返回值res=curl_easy_perform(curl);printf("OK:%d\n",res);curl_easy_cleanup(curl);}returntrue;}intmain(void){postUrl();}编译:1gccOCR.c-I./curl-7.71.1/_install/include/-L./curl-7.71.1/_install/lib/-lcurl运⾏结果:1ok:1证明失败了,没有跟翔云的后台接通,回调函数没有打印后台返回来的数据。(1)编译libcul库⽀持SSL那是因为在编译lincul库的时候,没有选择⽀持SSL。./configure--with-ssl我们访问的接⼝是https开头的,要进⾏⾝份验证和数据加密的,体现在我们的key和secret。HTTPS协议是由SSL+HTTP协议构建的可进⾏加密传输、⾝份认证的⽹络协议所以要重新编译,让我们编译出来的libcurl⽀持SSL.回忆之前libcurl的INSTALL.md那我们就要回到/curl-7.71.1路径下,删除rm_install-rf上次编译出来的⽂件夹,重新编译⽀持SSL的库。由/docs/INSTALL.md我们可以得知要想⽀持SSL,就得./configure--with-ssl。所以我们要这样配置1./configure--prefix=$PWD/_install--with-ssl编译错误,12chekingforSSL_connectin-lssl...(cached)nonoconfigure:error:openSSLlibsand/ordirectorieswerenotfoundwherespecified!(2)linux系统安装SSL依赖库:开源⼯具wget想要⽀持SSL必须要有依赖库,需要系统中已经安装好了SSL。我们需要安装openSSL.tar但是搜索的到的都是要钱的,如何免费下载呢?利⽤linux的开源⼯具下载:wget是Linux中的⼀个下载⽂件的⼯具,wget是在Linux下开发的开放源代码的软件。百度搜索技巧:wgetopenSSL.tar找到类似于这样:回到curl⽂件夹的上⼀级⽬录,执⾏命令(即安装在curl⽂件夹外⾯)1wget/source/openssl-1.1.1a.tar.gz注意:⼤坑,这个a在Ubuntu可以⽤,但是在树莓派不⾏,总是报错表⽰他链接不到库,烦死了!!最好是在下⾯这个⽹站下载openssl-1.1.1j.tar.gz1/source/解压1tarxvfopenssl-1.1.1a.tar.gz进⼊⽂件夹,直接去看他的INSTALL。为了避免到时候编译这个curl⼜要去配置SSL这个库,我们直接把SSL安装到默认的系统位置去,所以不指定安装路径了,直接在/openssl-1.1.1a路径下,配置1./config编译(起码编译了8,9分钟)1make安装:1sudomakeinstall要加sudo因为肯定安装在了usr/local中,⾮⼯作⽬录⽆权限(3)curl库重新进⾏配置,编译,安装回到/curl⽬录下重新进⾏配置:111./configure--prefix=$PWD/_install--with-sslmakemakeinstall(4)重新编译⼈脸识别的⽂件,这次我们已经开启了SSL1gccOCR.c-I./curl-7.71.1/_install/include/-L./curl-7.71.1/_install/lib/-lcurl在树莓派上编译的时候⼀定要多链接两个库-lssl-lcrypto否则会报错:1234./curl-7.71.1/_install/lib//libcurl.so:undefinedreferenceto`SSL_CTX_set_keylog_callback@OPENSSL_1_1_1'./curl-7.71.1/_install/lib//libcurl.so:undefinedreferenceto`SSL_CTX_set_post_handshake_auth@OPENSSL_1_1_1'./curl-7.71.1/_install/lib//libcurl.so:undefinedreferenceto`SSL_CTX_set_ciphersuites@OPENSSL_1_1_1'collect2:error:ldreturned1exitstatus运⾏可以看到已经收到了翔云后台的反馈:123===========getdata===========<?xmlversion="1.0"encoding="UTF-8"standalone="yes"?><data><message><status>-7</status><value>必传参数为空</value></message></dataOK:23必传参数为空的原因是:代码中没有传⼊图⽚给它识别(5)修改代码:把图⽚的base64流作为参数传⼊Base64是⽹络上最常见的⽤于传输8Bit字节码的编码⽅式之⼀,可⽤于在HTTP环境下传递较长的标识信息。在Linux下⽣成图⽚的base64编码1base64photo.jpg⼤致思路:(尚未进⾏封装)12system("base64zhu1.jpg>tmpFile1");//把编码的结果保存到tmpFile1中3intfdPic1=open("./tmpFile1",O_RDWR);//创建⽂件保存编码intfileLenPic1=lseek(fdPic1,0,SEEK_END);//45lseek(fdPic1,0,SEEK_SET);//⽂件指针回头67char*bufPic1=(char*)malloc(fileLenPic1+8);memset(bufPic1,'\0',fileLenPic1+8);8910111213read(fdPic1,bufPic1,fileLenPic1);//把⽂件内容度进取buf中//做个简单的测试//printf("%s\n",buf);close(fdPic1);AAAAAAAAAAAAAAAA如果平台返回的数据死活提⽰你传参错误:当你打开tmpFile1想看看编码的结果,如果后⾯出现很长很⼤⼀段的这个,成千上万的AAAAAAAAAAAAA,我想你应该跟我⼀样,直接⼿机拍⾃⼰⼀张图⽚就扔进去了。查看图⽚的⼤⼩,往往是4~5个M,⾮常⼤!!也不符合平台的要求。转化成⼩⼀点的这些AAAAA就消失了。怎样快速压缩图⽚⼤⼩??⽤QQ给图⽚截图,保存的时候转换为jpg格式,⼀般能够直接压缩到50多个K,⾮常好⽤。最终程序:识别成功程序⼤意:向OCR后台传⼊两张图⽚的base64流,后台经过判断返回数据,程序接收数据并判断是否含有“是”,若有,则输出⼈脸识别结果为“同⼀个⼈”。12#include<stdio.h>#include<curl/curl.h>#include<string.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>345678#include<unistd.h>910111213141516171819202122232425262728293031323334353637383940414243444546474849typedefunsignedintbool;//数据类型别名⽤typedef#definetrue1#definefalse0//宏定义⽤definecharocrRetBuf[1024]={'\0'};//全局变量,⽤来接收从OCR后台返回的数据size_treadData(void*ptr,size_tsize,size_tnmemb,void*stream)//回调函数,把从后台的数据拷贝给ocrRetBuf{strncpy(ocrRetBuf,ptr,1024);}char*getBase64FromFile(char*filePath){char*base64Buf=NULL;charcmd[256]={'\0'};sprintf(cmd,"base64%s>tmpFile",filePath);//图⽚的base64system(cmd);流导⼊到⽂件中intfd=open("./tmpFile",O_RDWR);intfileLen=lseek(fd,0,SEEK_END);lseek(fd,0,SEEK_SET);base64Buf=(char*)malloc(fileLen+8);memset(base64Buf,'\0',fileLen+8);read(fd,base64Buf,fileLen+8);close(fd);//从⽂件中读取base64流到字符串system("rm-ftmpFile");returnbase64Buf;//指针变量随着⼦程序调⽤结束消失,但返回了指向有数据地址的指针。}boolpostUrl(){CURL*curl;CURLcoderes;//分开定义,然后字符串拼接char*key="xxx";4950515253545556575859606162636465666768697071727374757677787980818283848586char*secret="xxx";inttypeId=21;char*format="xml";char*base64BufPic1=getBase64FromFile("./zhu1.jpg");char*base64BufPic2=getBase64FromFile("./zhu2.jpg");intlen=strlen(key)+strlen(secret)+strlen(base64BufPic1)+strlen(base64BufPic2)+128;//分配空间不够会>导致栈溢出char*postString=(char*)malloc(len);memset(postString,'\0',len);//因为postString是⼀个指针,不能⽤sizeof来计算其指向的⼤⼩sprintf(postString,"img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s",base64BufPic1,base64BufPic2,key,secret,typeId,format)curl=curl_easy_init();if(curl){curl_easy_setopt(curl,CURLOPT_POSTFIELDS,postString);//指定post内容,传⼊参数curl_easy_setopt(curl,CURLOPT_URL,"/api/faceliu.do");//指定urlcurl_easy_setopt(curl,CURLOPT_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论