如何利用C++和libCurl使用OCR SDK,本文的目的是教你如何通过与OCR SDK的对接,使用C++进行OCR。
你应该在我们的代码中看到这两行占位符。
C++
#define APP_ID "<Your Application ID>" #define PASSWORD "<Your Application Password" 1 2 3 4 5
复制代码类型:[cpp]
用你分配的应用程序ID和应用程序密码替换这些字符串。
启动libCurl
首先,我们启动Curl对象:assword。
C++
curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); 1 2 3 4 5
复制代码类型:[cpp]
处理输入文件
我们的输入文件可以是任何图像,甚至是一个PDF文件。我们需要将其转换为MIME格式,为此,我们调用:
C++
<a href="https://curl.se/libcurl/c/curl_mime_init.html">curl_mime_init()</a> 1 2
复制代码类型:[cpp]
接下来,我们在请求中生成上传的部分。
C++
field = curl_mime_addpart(form); curl_mime_name(field, "upload"); 1 2 3 4 5
复制代码类型:[cpp]
并使用curl_mine_filedata()生成文件数据,它用于从输入文件的内容中设置我们的mime部分的主体数据。
C++
curl_mime_filedata(field, file_to_upload.c_str()); 1 2 3 4
复制代码类型:[cpp]
现在,我们通过调用curl_easy_setopt()来设置选项,正如其名字所暗示的,它为我们的请求准备设置选项。
我们需要以下属性。
● PROCESSING_URL是Abbyy SDK给出的URL。
● headerlist在前面已经设置好了。
● form是上传部分。
● APP_ID是Abbyy SDK为我们开发的每个软件提供的特定应用识别。
● PASSWORD是应用程序的密码,需要生成。
● CURLOPT_WRITEFUNCTION是一个回调函数,用于写入请求的结果。数据被写入readBuffer中,它将保存我们从API收到的结果。APP_ID is an application specific identifying provided by Abbyy SDK per each software we develop.
C++
curl_easy_setopt(curl, CURLOPT_URL, PROCESSING_URL); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist); curl_easy_setopt(curl, CURLOPT_MIMEPOST, form); curl_easy_setopt(curl, CURLOPT_USERNAME, APP_ID); curl_easy_setopt(curl, CURLOPT_PASSWORD, PASSWORD); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CurlWrite_CallbackFunc_StdString); curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer); 1 2 3 4 5 6 7 8
复制代码类型:[cpp]
然后,我们准备执行我们的请求。我们调用curl_easy_perform()。
C++
res = curl_easy_perform(curl); 1 2
复制代码类型:[cpp]
紧接着我们检查结果。
检查结果
接下来,我们获得任务ID,它被赋予了每个OCR任务。你可以启动几个任务,然后等待每个任务的完成。我们使用我们获得的Task_ID来检查任务的状态,并等待它完成。
C++
while (1) { res = curl_easy_perform(status_curl); if (res != CURLE_OK) { WriteLogFile(L"Error: %S", curl_easy_strerror(res)); } else { WriteLogFile(L"Read Buffer:\n%S", readBuffer.c_str()); task_status = ObtainStatus(readBuffer); WriteLogFile(L"task_status: %S", task_status.c_str()); } if (task_status != "Completed") { //wait 5s before next check Sleep(2000); } else { setcolor(LOG_COLOR_DARKGREEN, 0); SetConsoleTitle(L"OCR completed"); setcolor(LOG_COLOR_WHITE, 0); result_url = ObtainURL(readBuffer); //replace all & to & result_url = ReplaceAll(result_url, "&", "&"); //downloading text file of response WriteLogFile(L"Downloading File from URL: %S", result_url.c_str()); op_curl = curl_easy_init(); if (op_curl) { headerlist = curl_slist_append(headerlist, buf); curl_easy_setopt(op_curl, CURLOPT_URL, result_url.c_str()); curl_easy_setopt(op_curl, CURLOPT_HTTPHEADER, headerlist); curl_easy_setopt(op_curl, CURLOPT_HTTPGET, 1L); FILE* wfd = fopen(json_result_file.c_str(), "ab"); fprintf(wfd, "\n"); curl_easy_setopt(op_curl, CURLOPT_WRITEDATA, wfd); curl_easy_perform(op_curl); curl_easy_cleanup(op_curl); fclose(wfd); WriteLogFile(L"FILE saved"); } break; } readBuffer = ""; } // While 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
复制代码类型:[cpp]
现在,一旦我们有了结果,我们只需清理一切。
构建块
这个项目的关键构建模块之一是libCurl。我把它作为一个静态库使用。.lib文件包含在文章的源代码中,但是你可以在这里阅读关于使用libCurl作为静态库的信息。
注意:WriteLogFile()是我在这篇文章中描述的一个老的日志函数。
使用代码
你可以使用不同的导出格式。请看这个链接的选项。
你可以定义你所期望的语言。请看这个链接的选项。
你可以使用许多语言,其中大部分也可以作为手写文本(ICR)。你在PROCESSING_URL字符串中设置预期语言的列表。
C++
#define PROCESSING_URL "https://cloud-westus.ocrsdk.com/processImageexportFormat=txt&language=English,Hebrew#define PROCESSING_URL "https://cloud-westus.ocrsdk.com/processImageexportFormat=txt&language=English,Hebrew
免费领取C++资料包