如何利用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++资料包