多线程OCR与自动识别管理器- Windows C DLL

本教程展示了如何在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教程。

创建项目并添加LEADTOOLS引用

中创建的64位Windows API项目的副本添加引用和设置License教程。如果项目不可用,请按照该教程中的步骤创建它。

为了利用LEADTOOLS OCR功能,需要额外的头文件和DLL文件。打开预编译的头文件(或pch.hstdafx.h,取决于所使用的Visual Studio版本),并添加以下行:

# include“C: \ LEADTOOLS22 \ \ ltocr.h包括”#pragma comment (lib,“C: \ \ LEADTOOLS22 \ \ Lib \ \ CDLL \ \ x64 \ \ Ltocr_x.lib”// OCR支持

请注意

有关OCR应用程序所需DLL文件的完整列表,请参阅你的申请所包含的文件

设置License文件

许可证解锁项目所需的特性。它必须在调用任何工具箱函数之前设置。有关详细信息,包括针对不同平台的教程,请参阅设置运行时License

有两种类型的运行时许可证:

请注意

中更详细地介绍了添加LEADTOOLS引用和设置许可添加引用和设置License教程。

添加多线程OCR代码

现在已经添加了LEADTOOLS引用并设置了许可证,可以开始编码了。

以下步骤适用于Visual Studio 2019;对于Visual Studio的其他版本,它们可能有所不同。

解决方案资源管理器双击资源文件(.rc)。

展开资源树中的菜单,双击菜单资源,在设计器界面中打开。

的空项中退出项,单击并键入多流ocr.将新项目拖到上面退出.这将导致该项的ID变为ID_FILE_MULTITHREADOCR

转到项目的主CPP文件,并导航到指向主窗口功能。下开关(wmId)表述,就是下面的WM_COMMANDCase,添加一个新的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 >){//在所有线程退出之前不要关闭OCRWaitForMultipleObjects(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文件。使用顺序处理和并行处理的不同组合,重复执行四次。

应用程序显示OCR进度

请注意

在图像所示的测试中,并行处理目录文档和每个文档的页面时获得了最佳结果。然而,不同的图像集或具有不同CPU核数的不同计算机可能产生不同的结果。因此,在应用程序将要使用的实际硬件上,使用代表用例的实际图像进行测试是很重要的。

总结

本教程展示了如何创建一个Windows c++ OCR应用程序,该应用程序使用LEAD OCR引擎来比较使用不同的顺序处理和并行处理技术时的性能。

另请参阅

iOS
188金宝搏的网址客服|支持|联系我们|知识产权公告
©1991 - 2023领德科技有限公司版权所有。