如何利用C++和libCurl使用OCR SDK

开课吧小一2021-04-22 16:04

点赞
1
分享分享

如何利用C++和libCurl使用OCR SDK,本文的目的是教你如何通过与OCR SDK的对接,使用C++进行OCR。

你应该在我们的代码中看到这两行占位符。

C++
#define APP_ID            "<Your Application ID>"
#define PASSWORD        "<Your Application Password"

用你分配的应用程序ID和应用程序密码替换这些字符串。

启动libCurl

首先,我们启动Curl对象:assword。

C++
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();

处理输入文件

我们的输入文件可以是任何图像,甚至是一个PDF文件。我们需要将其转换为MIME格式,为此,我们调用:

C++
<a href="https://curl.se/libcurl/c/curl_mime_init.html">curl_mime_init()</a>

接下来,我们在请求中生成上传的部分。

C++
field = curl_mime_addpart(form);
curl_mime_name(field, "upload");

并使用curl_mine_filedata()生成文件数据,它用于从输入文件的内容中设置我们的mime部分的主体数据。

C++
curl_mime_filedata(field, file_to_upload.c_str());

现在,我们通过调用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);

然后,我们准备执行我们的请求。我们调用curl_easy_perform()。

C++
res = curl_easy_perform(curl);

紧接着我们检查结果。

检查结果

接下来,我们获得任务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 &amp; to &
        result_url = ReplaceAll(result_url, "&amp;", "&");
        //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

现在,一旦我们有了结果,我们只需清理一切。

构建块

这个项目的关键构建模块之一是libCurl。我把它作为一个静态库使用。.lib文件包含在文章的源代码中,但是你可以在这里阅读关于使用libCurl作为静态库的信息。

注意:WriteLogFile()是我在这篇文章中描述的一个老的日志函数。

使用代码

你可以使用不同的导出格式。请看这个链接的选项。

你可以定义你所期望的语言。请看这个链接的选项。

你可以使用许多语言,其中大部分也可以作为手写文本(ICR)。你在PROCESSING_URL字符串中设置预期语言的列表。

C++
#define PROCESSING_URL    
"https://cloud-westus.ocrsdk.com/processImage?exportFormat=txt&language=English,Hebrew"

如果对C++技术以及相关信息感兴趣,可以去开课吧C/C++教程频道,了解更多相关信息。

相关推荐:

C++的定义与技术知识点

学好C++能够从事哪些岗位?

C/C++存在哪些特点?

有用1
分享