1.实现思路:
通过ocr人工智能平台在线识别两图片相似度
2.依赖库
2.1.openssl
由于平台api使用的是https协议,所以需要安装openssl库;
wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz //下载包
tar -vxf openssl-1.1.1a.tar.gz //解压包
cd openssl-1.1.1a //进入目录
./config //设置配置
make //写入配置
sudo make install //安装openssl
2.2.curl
需要访问网络,所以需要curl库
官网下载相应的包
cd curl-7.71.1/ //进入解压后的目录
./configure --prefix=$PWD/_install --with-ssl //设置配置
//--prefix表示要安装的路径 --with-ssl表示编译时要带openssl环境
make //写入配置
make install //安装
3.代码
ocr.c:
#include <stdio.h>
#include <curl/curl.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#define true 1
#define false 0
typedef unsigned int bool;
char buf[1280] = {'\0'};
size_t readDate(void *ptr,size_t size,size_t nmemb,void *stream){
stpncpy(buf,ptr,1024);
}//将平台返回的数据保存下来以便后续操作
char *getPicBase64FromFile(char *filePath){
char *bufPic;
char cmd[128] = {'\0'};
sprintf(cmd,"base64 %s > tmpFile",filePath);//制作一个命令字符串
//通过linux自带的base命令获取图片base64流编码
//并写入文件
system(cmd);
int fd = open("./tmpFile",O_RDWR);
int filelen = lseek(fd,0,SEEK_END);//巧妙通过lseek函数获取文件大小
lseek(fd,0,SEEK_SET);//将文件偏移量重置
bufPic = (char *)malloc(filelen + 2);
memset(bufPic,'\0',filelen);
read(fd,bufPic,filelen);
close(fd);
system("rm -f tmpFile");
return bufPic;
}//通过文件名获取图片的base64编码
bool postUrl(char *filename){
CURL *curl;
CURLcode res;
char *img1 = getPicBase64FromFile("./8.jpg");
char *img2 = getPicBase64FromFile("./9.jpg");
char *key = "*******";//人工智能云平台获取的
char *secret = "******";//人工智能云平台获取的
int typeId = 21;
char *format = "xml";
char *postString;
int len = strlen(img1) + strlen(img2) + strlen(key) + strlen(secret) + 256;
postString = (char *)malloc(len);
memset(postString,'\0',len);
sprintf(postString,"img1=%s&img2=%s&key=%s&secret=%s&typeId=21&format=%s",img1,img2,key,secret,format);
//通过sprintf拼接出post请求需要的参数
curl = curl_easy_init();//初始化请求,并获取操作句柄
if (curl){
curl_easy_setopt(curl, CURLOPT_POSTFIELDS,postString);// 指定post内容
curl_easy_setopt(curl, CURLOPT_URL, "https://netocr.com/api/faceliu.do");// 指定url
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, readDate);//设置发生请求的回调函数
res = curl_easy_perform(curl);//发起请求
if(strstr(buf,"是") != NULL){
printf("the same person\n");
}else{
printf("diff person\n");
}
curl_easy_cleanup(curl);//请求结束释放内存
}
return true;
}
int main(void){
postUrl("/tmp/post.html");
return 0;
}