本教程展示了如何在C/ c++ Windows API应用程序中使用LEADTOOLS SDK多线程OCR引擎进行并行处理。
概述 | |
---|---|
总结 | 本教程介绍如何在Windows C DLL应用程序中使用LEAD自动识别管理器多线程OCR引擎。 |
完成时间 | 45分钟 |
Visual Studio项目 | 下载教程项目(19kb) |
平台 | Windows C DLL应用程序 |
IDE | Visual Studio 2017, 2019 |
开发许可 | 下载LEADTOOLS |
用另一种语言试试 |
|
在开始之前多线程OCR与自动识别管理器- Windows C DLL本教程中,通过回顾添加引用和设置License教程。
中创建的64位Windows API项目的副本添加引用和设置License教程。如果项目不可用,请按照该教程中的步骤创建它。
为了利用LEADTOOLS OCR功能,需要额外的头文件和DLL文件。打开预编译的头文件(或pch.h
或stdafx.h
,取决于所使用的Visual Studio版本),并添加以下行:
# include“C: \ LEADTOOLS22 \ \ ltocr.h包括”
#pragma comment (lib,“C: \ \ LEADTOOLS22 \ \ Lib \ \ CDLL \ \ x64 \ \ Ltocr_x.lib”)// OCR支持
请注意
有关OCR应用程序所需DLL文件的完整列表,请参阅你的申请所包含的文件.
许可证解锁项目所需的特性。它必须在调用任何工具箱函数之前设置。有关详细信息,包括针对不同平台的教程,请参阅设置运行时License.
有两种类型的运行时许可证:
请注意
中更详细地介绍了添加LEADTOOLS引用和设置许可添加引用和设置License教程。
现在已经添加了LEADTOOLS引用并设置了许可证,可以开始编码了。
以下步骤适用于Visual Studio 2019;对于Visual Studio的其他版本,它们可能有所不同。
去解决方案资源管理器双击资源文件(.rc)。
展开资源树中的菜单,双击菜单资源,在设计器界面中打开。
的空项中退出项,单击并键入多流ocr.将新项目拖到上面退出.这将导致该项的ID变为ID_FILE_MULTITHREADOCR
.
转到项目的主CPP文件,并导航到指向
主窗口功能。下开关(wmId)
表述,就是下面的WM_COMMAND
Case,添加一个新的Case:
开关(wmId)
{
情况下ID_FILE_MULTITHREADOCR:
{
TCHAR szFolderIn[1024] = TEXT(”“);//输入文件位置
//选择输入文件文件夹
如果= GetSourceFolder(hWnd, szFolderIn, ARRAYSIZE(szFolderIn)))
打破;
浮动time1 = ProcessFolder(hWnd, szFolderIn,假,假);
如果(time1 < 0)
打破;
浮动time2 = ProcessFolder(hWnd, szFolderIn,假,真正的);
如果(time2 < 0)
打破;
浮动time3 = ProcessFolder(hWnd, szFolderIn,真正的,假);
如果(time3 < 0)
打破;
浮动time4 = ProcessFolder(hWnd, szFolderIn,真正的,真正的);
如果(time4 < 0)
打破;
TCHAR szResult [2000];
_stprintf_s(szResult, ARRAYSIZE(szResult), TEXT(“测试时间(秒):\n”
“%。1f\tBoth sequential\n"
“%。1f\tParallel pages\n"
“%。1f\tParallel documents\n"
“%。1f\tBoth parallel"), time1, time2, time3, time4);
消息框(hWnd, szResult, TEXT(“识别时间”), MB_ICONINFORMATION);
}
打破;
//保留其余的代码
的OCR自动识别管理器支持在处理作业时使用多个线程,可以使用L_OcrAutoRecognizeManagerOptions: UseThreads
结构成员。
也可以在其自己的线程中执行每个作业,这将在下面的代码中使用CreateThread ()
函数。
添加两个函数ProcessFolder
而且RecognizeTif
以上指向
函数并向它们添加以下代码:
结构体RECOGNIZE_PARAMS
{
L_OcrAutoRecognizeManager autoRecognizeManager;
TCHAR * pszTifFile;
TCHAR * pszPdfFile;
};
WINAPI识别程序(无效* pParam)
{
RECOGNIZE_PARAMS* pRecParam = (RECOGNIZE_PARAMS*)pParam;
L_OcrAutoRecognizeManager_Run(pRecParam->autoRecognizeManager, pRecParam->pszTifFile, pRecParam->pszPdfFile, DOCUMENTFORMAT_PDF, NULL);
返回0;
}
//
//函数:ProcessFolder
//返回值:
// < 0:错误
// >= 0:运行时间
//
浮动ProcessFolder(HWND HWND, tsar * pszFolderIn,保龄球parallelPages,保龄球parallalDocuments)
{
TCHAR szFolderSearch[1000] = TEXT(”“);//输入文件搜索位置和模式
_tcscpy_s(szFolderSearch, ARRAYSIZE(szFolderSearch), pszFolderIn);
ARRAYSIZE(szFolderSearch), TEXT(“\ \ * .tif”));
WIN32_FIND_DATA FindFileData = {0};
HANDLE hFind = FindFirstFile(szFolderSearch, &FindFileData);
如果(INVALID_HANDLE_VALUE == hFind)
{
对话框(hWnd,文本("在文件夹中没有找到TIF文件"),文本(“LEADTOOLS演示”), MB_ICONERROR);
返回1;
}
L_OcrEngine ocrEngine = NULL;
L_OcrAutoRecognizeManager autoRecognizeManager = NULL;
L_OcrAutoRecognizeManagerOptions autoRecognizeOptions = {0};
L_OcrDocumentManager = NULL;
如果(L_OcrEngineManager_CreateEngine(L_OcrEngineType_LEAD, &ocrEngine) != SUCCESS)
返回1;
l_ocrengine_start (ocrEngine, NULL, TEXT(“C: \ \ LEADTOOLS22 \ \ Bin \ \共同\ \ OcrLEADRuntime”));
L_OcrEngine_GetAutoRecognizeManager (ocrEngine &autoRecognizeManager);
autoRecognizeOptions。StructSize =运算符L_OcrAutoRecognizeManagerOptions;
L_OcrAutoRecognizeManager_GetOptions (autoRecognizeManager &autoRecognizeOptions);
autoRecognizeOptions。UseThreads = parallelPages;
//在识别之前,将所有页面倾斜并自动定向
autoRecognizeOptions。PreprocessPageCommands = L_OcrAutoPreprocessPageCommands_Deskew | L_OcrAutoPreprocessPageCommands_Rotate;
L_OcrAutoRecognizeManager_SetOptions (autoRecognizeManager &autoRecognizeOptions);
//使用图像/文本选项创建pdf文件
L_OcrEngine_GetDocumentManager (ocrEngine &ocrDocumentManager);
DOCWRTPDFOPTIONS pdfOptions;
pdfOptions.Options.uStructSize =运算符DOCWRTPDFOPTIONS;
L_OcrDocumentManager_GetFormatOptions(ocrDocumentManager, DOCUMENTFORMAT_PDF, &pdfOptions.Options);
//设置我们想要的PDF选项
pdfOptions。bImageOverText =真正的;
pdfOptions。PdfProfile = DOCWRTPDFPROFILE_PDF;
L_OcrDocumentManager_SetFormatOptions(ocrDocumentManager, DOCUMENTFORMAT_PDF, &pdfOptions.Options);
ULONGLONG timeStart = GetTickCount64();
intnThreadCount = 0;
HANDLE hThreads[MAXIMUM_WAIT_OBJECTS] = {0};
做
{
如果(nThreadCount >= MAXIMUM_WAIT_OBJECTS)
{
对话框(hWnd,文本(“这个测试文档太多了”),文本(“LEADTOOLS演示”), MB_ICONERROR);
返回1;
}
TCHAR szTifFile[1024] = TEXT(”“);//输入文件的完整位置和名称
_tcscpy_s(szTifFile, ARRAYSIZE(szTifFile), pszFolderIn);
_tcscat_s(szTifFile, ARRAYSIZE(szTifFile), TEXT("\\"));
_tcscat_s(szTifFile, ARRAYSIZE(szTifFile), FindFileData.cFileName);
TCHAR szPdfFile[1024] = TEXT(”“);//输出文件的完整位置和名称
_tcscpy_s(szPdfFile, ARRAYSIZE(szPdfFile), szTifFile);
_tcscat_s(szPdfFile, ARRAYSIZE(szPdfFile), TEXT(. pdf”));
RECOGNIZE_PARAMS参数= {0};
参数。autoRecognizeManager = autoRecognizeManager;
参数。pszTifFile = szTifFile;
参数。pszPdfFile = szPdfFile;
如果(parallalDocuments)//调用一个新线程
{
hThreads[nThreadCount] = CreateThread(NULL, 0, RecognizeTif, ¶m, 0, NULL);
nThreadCount + +;
}
其他的//顺序文档,直接调用
RecognizeTif(参数);
}而(FindNextFile(hFind, &FindFileData) != 0);
如果(nThreadCount >)
{
//在所有线程退出之前不要关闭OCR
WaitForMultipleObjects(nThreadCount, hThreads, TRUE, INFINITE);
//释放所有线程句柄
而(nThreadCount >)
{
nThreadCount——;
CloseHandle (hThreads [nThreadCount]);
}
}
ULONGLONG timeElapsed = GetTickCount64() - timeStart;
L_OcrEngine_Shutdown (ocrEngine);
L_OcrEngine_Destroy (ocrEngine);
返回timeElapsed / 1000.0;
}
的GetSourceFolder ()
函数可以是填充szFolderIn
变量,该变量具有包含TIFF文件的有效文件夹名。要显示选择文件夹对话框获取文件夹名称,添加以下代码:
# include < shobjidl_core.h >
L_INT GetSourceFolder(HWND HWND, tsar * pszFolder, rsize_t string_size)
{
L_INT nRet =失败;
IFileOpenDialog* pFileOpenDialog = NULL;
IShellItem* pShellItem = NULL;
CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_INPROC_SERVER, IID_IFileOpenDialog, (无效* *) &pFileOpenDialog);
如果(pFileOpenDialog)
{
pFileOpenDialog - > setoption (FOS_PICKFOLDERS);
如果(成功(pFileOpenDialog - >显示(hWnd)))
{
pFileOpenDialog - > GetResult (&pShellItem);
LPWSTR pFolder = NULL;
pShellItem - > GetDisplayName (SIGDN_FILESYSPATH &pFolder);
如果(pFolder)
{
_tcscpy_s(pszFolder, string_size, pFolder);
CoTaskMemFree (pFolder);
nRet = SUCCESS;
}
}
}
如果(pShellItem)
pShellItem - >释放();
如果(pFileOpenDialog)
pFileOpenDialog - >释放();
返回nRet;
}
按下运行项目F5,或选择Debug ->开始调试.
如果正确地执行了这些步骤,应用程序将运行并允许用户选择一个输入文件夹。然后,应用程序处理输入文件夹中的每个TIFF文件,并从中创建一个新的PDF文件。使用顺序处理和并行处理的不同组合,重复执行四次。
请注意
在图像所示的测试中,并行处理目录文档和每个文档的页面时获得了最佳结果。然而,不同的图像集或具有不同CPU核数的不同计算机可能产生不同的结果。因此,在应用程序将要使用的实际硬件上,使用代表用例的实际图像进行测试是很重要的。
本教程展示了如何创建一个Windows c++ OCR应用程序,该应用程序使用LEAD OCR引擎来比较使用不同的顺序处理和并行处理技术时的性能。