现在我抛砖引玉一下,用百度OCR来识别文字中的文本。 首先要去注册一个百度的帐号,这里不说了,我想大家都会。注册帐号后到登陆后,申请相关的API KEY和secret key .这些东西我就不说了,在大家去申请好了。 现在说一下代码,百度OCR用C代码调用分为两步,第一步是用API KEY和secret key去申请access token。申请代码如下,大家复制一下就好了 static size_t callback(void *ptr, size_t size, size_t nmemb, void *stream) { std::string s((char *)ptr, size * nmemb); Json::Reader reader; Json::Value root; reader.parse(s, root); access_token_result = root["access_token"].asString(); return size * nmemb; } int get_access_token(std::string &access_token, const std::string &AK, const std::string &SK) { CURL *curl; CURLcode result_code; int success; curl = curl_easy_init(); string aa = (access_token_url + "&client_id=" + AK + "&client_secret=" + SK).data(); if (curl) { curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); //设置问非0表示本次操作为post curl_easy_setopt(curl, CURLOPT_URL, (access_token_url + "&client_id=" + AK + "&client_secret=" + SK).data()); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback); result_code = curl_easy_perform(curl); if (result_code != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(result_code)); success = 1; return success; } access_token = access_token_result; curl_easy_cleanup(curl); success = 0; } else { fprintf(stderr, "curl_easy_init() failed."); success = 1; } return success; } void mian() { string access_token; get_access_token(access_token, "**************", "*************");//第一个参数是记录你申请的access token,第二个是API key ,第三个Secret key } 这个代码运行完后就在变量access_token里就是我们要申衣的access token,用这个access token就可以进行OCR的调用了。调用代码如下 static size_t OCRcallback(void *ptr, size_t size, size_t nmemb, void *stream) { // 获取到的body存放在ptr中,先将其转换为string格式 general_ocr_result = std::string((char *)ptr, size * nmemb); return size * nmemb; } int general_ocr(std::string &json_result, const std::string &image_base64, const std::string &access_token) { std::string url = general_ocr_url + "?access_token=" + access_token; CURL *curl; CURLcode result_code; int is_success; curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false); //设置问非0表示本次操作为post curl_easy_setopt(curl, CURLOPT_URL, url.data()); curl_easy_setopt(curl, CURLOPT_POST, 1); curl_httppost *post = NULL; curl_httppost *last = NULL; curl_formadd(&post, &last, CURLFORM_COPYNAME, "image", CURLFORM_COPYCONTENTS, image_base64.data(), CURLFORM_END); curl_easy_setopt(curl, CURLOPT_HTTPPOST, post); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OCRcallback); result_code = curl_easy_perform(curl); if (result_code != CURLE_OK) { fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(result_code)); is_success = 1; return is_success; } json_result = general_ocr_result; curl_easy_cleanup(curl); is_success = 0; } else { fprintf(stderr, "curl_easy_init() failed."); is_success = 1; } return is_success; } void mian() { Mat img = imread("1.bmp"); vector<uchar> vecImg; //Mat 图片数据转换为vector<uchar> vector<int> vecCompression_params; vecCompression_params.push_back(CV_IMWRITE_JPEG_QUALITY); vecCompression_params.push_back(90); imencode(".bmp", img, vecImg, vecCompression_params); string image= Encode(vecImg.data(), vecImg.size()); string json_result; general_ocr(json_result, image, access_token);//第一个参数是返回的识别结果,第二个是图片,第三个是我们刚才申请的access token } 注:以上代码和百度提供的调用代码不同,百度提供的代码是申请不了access_token和识别文字的。 这样在json_result里就是识别出来的文字,大家去试一下吧!!如果大家实现不了可以联系QQ154482118,我一步一步的告诉你,不过我感觉上边说的很详细了。 |
相关文章
- js中的4种函数调用模式:函数调用、方法调用、构造器调用、间接调用
- 面向对象_匿名内部类的方法调用
- 如何确保你的构造函数只能被new调用,而不能被普通函数调用?
- Python 面向对象编程的一些特征 及 单例模式的实现, 父类方法的调用(python2/python3)
- 【推荐】开源来自百度商业前端数据可视化团队的超漂亮动态图表--ECharts
- 百度 UEditor 简单安装调试和调用,网上其它的教程太官方了,不适合新手
- 我做的百度飞桨PaddleOCR .NET调用库
- C#远程调用的问题,请高手指教
- Atitit.java jna 调用c++ dll 的总结
- Atitit.java jna 调用c c++ dll的原理与实践 总结 v2 q27