C++通过调用Python函数调用讯飞OCR识别接口

关于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

猜你喜欢

转载自blog.csdn.net/weixin_38285131/article/details/81511467