关于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,requestdef 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'#申请的apiKeyparam = {"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_decodetext = 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 resultif __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.pyif (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