关于C++调用python函数的配置,在前两篇博客中已有介绍:
C++调用Python函数(一)——配置及测试
C++调用Python函数(二)——调用函数并输出返回值
最近做OCR字符识别方面的工作,想通过讯飞的接口进行OCR识别,前面的算法预处理,分图等工作是用C++完成的,但是用C++调用讯飞接口比较困难,于是想利用C++调用Python函数去调用讯飞接口。
一丶Python调用讯飞OCR接口函数
到讯飞开放平台进行注册,日免费次数500次
讯飞开放平台
获取自己的APIID和apiKey
import time
import urllib
import json
import hashlib
import base64
from urllib import parse,request
def main(filepath):
f = open(filepath, 'rb')#图片存放位置
file_content = f.read()
base64_image = base64.b64encode(file_content)
body = urllib.parse.urlencode({'image': base64_image}) # body数据
body = bytes(body, 'utf-8')
url = 'http://webapi.xfyun.cn/v1/service/v1/ocr/handwriting'
api_key = 'xxxxxxxxxxxxxxxxxxxxxxxx'#申请的apiKey
param = {"language":"en", "location":"false"} # header中参数
param_json = json.dumps(param).replace(' ', '')#字符串类型
x_appid = 'XXXXXXXX'#讯飞的APIID,自己申请的
param1=bytes(param_json,'utf-8')
#pdb.set_trace()
x_param = base64.b64encode(param1)
x_param_decode = x_param.decode('utf-8')
x_time = int(int(round(time.time() * 1000)) / 1000)
text = api_key + str(x_time) + x_param_decode
text = bytes(text, 'utf-8')
x_checksum = hashlib.md5(text).hexdigest()
x_header = {'X-Appid': x_appid,
'X-CurTime': x_time,
'X-Param': x_param,
'X-CheckSum': x_checksum}
req = urllib.request.Request(url, body, x_header)
result = urllib.request.urlopen(req)
result = result.read().decode("utf-8")
print("讯飞返回结果,内部展示用的" + result)
return result
if __name__ == '__main__':
main(r"D:\SuWenbo\Project\xunfei\testfile\cusion.png")
上面的函数已经可以完成输入图片返回识别结果的工作:
输入图片:
输出结果:是一个字典,content即为识别结果
{“code”:”0”,”data”:{“block”:[{“type”:”text”,”line”:[{“confidence”:1,”word”:[{“content”:”see“}]}]}]},”desc”:”success”,”sid”:”wcr0005befd@dx26d00ec5f60f6f1a00”}
二丶C++调用Python函数实现OCR识别
我们利用C++调用上面的Python函数实现OCR识别,利用Python的PyObject
代码如下:
#include <Python.h>
#include<iostream>
#include<string>
using namespace std;
int main()
{
Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化
if (!Py_IsInitialized())
{
printf("初始化失败!");
return 0;
}
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");//这一步很重要,修改Python路径
PyObject * pModule = NULL;//声明变量
PyObject * pFunc = NULL;// 声明变量
pModule = PyImport_ImportModule("hello");//这里是要调用的文件名hello.py
if (pModule == NULL)
{
cout << "没找到" << endl;
}
pFunc = PyObject_GetAttrString(pModule, "main");//这里是要调用的函数名
if (pFunc == NULL)
{
cout << "函数没找到" << endl;
}
PyObject* args = Py_BuildValue("(s)", "D:/SuWenbo/Project/xunfei/testfile/cusion.png");//给python函数参数赋值
PyObject* pRet = PyObject_CallObject(pFunc, args);//调用函数
Py_Finalize();//调用Py_Finalize,这个根Py_Initialize相对应的。
return 0;
}
返回结果:
和Python返回结果一样,可以在上面的python函数里面加上一些截取字符串的操作,然后把content:see截取下来进行保存。
参考:
1.讯飞手写字符API