code_app/modules/imgproc/HGOCRHanvon.cpp

442 lines
9.9 KiB
C++
Raw Normal View History

2022-05-16 09:00:08 +00:00
#include "HGOCRHanvon.hpp"
2022-05-11 09:19:50 +00:00
#include "HGOCR.h"
#include "HGOCRRetImpl.hpp"
#include "HGOCRRetImpl.hpp"
#include "../base/HGUtility.h"
2022-08-09 03:38:19 +00:00
#include "../base/HGInfo.h"
2022-05-11 09:19:50 +00:00
#include "../imgfmt/HGBmp.h"
2022-08-23 03:06:18 +00:00
#include "../imgfmt/HGJpeg.h"
2022-05-11 09:19:50 +00:00
HGUInt HGOCRHanvon::m_refCount = 0;
2022-08-23 03:06:18 +00:00
HGOCRHanvon* HGOCRHanvon::m_OCR = NULL;
2022-05-11 09:19:50 +00:00
HGOCRHanvon::HGOCRHanvon()
{
m_dll = NULL;
m_ocrHandle = NULL;
2022-08-23 03:06:18 +00:00
m_imageList.clear();
m_func = NULL;
m_param = NULL;
m_FuncRet = 0;
2022-05-11 09:19:50 +00:00
}
HGOCRHanvon::~HGOCRHanvon()
{
}
HGResult HGOCRHanvon::Init()
{
if (NULL != m_ocrHandle)
{
return HGBASE_ERR_FAIL;
}
assert(NULL == m_dll);
HGChar moduleName[256];
HGBase_GetModuleName((void *)HGImgProc_CreateOCRMgr, moduleName, 256);
2022-07-30 01:36:16 +00:00
HGChar dllPath[256];
HGBase_GetFilePath(moduleName, dllPath, 256);
2022-05-11 09:19:50 +00:00
#if defined(HG_CMP_MSC)
2022-07-30 01:36:16 +00:00
strcat(dllPath, "hanwangOCRdetect.dll");
2022-05-11 09:19:50 +00:00
#else
2022-07-30 01:36:16 +00:00
strcat(dllPath, "libhwocrdetect.so");
2022-05-11 09:19:50 +00:00
#endif
2022-07-30 01:36:16 +00:00
HGResult ret = HGBase_CreateDll(dllPath, &m_dll);
2022-05-11 09:19:50 +00:00
if (HGBASE_ERR_OK != ret)
{
2022-08-09 03:38:19 +00:00
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "Load OCR Library Failed, path=%s", dllPath);
2022-05-11 09:19:50 +00:00
return ret;
}
if (0 != HWOCR_SDKInitialize(&m_ocrHandle))
{
2022-08-09 03:38:19 +00:00
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "Init OCR Library Failed");
2022-05-11 09:19:50 +00:00
HGBase_DestroyDll(m_dll);
m_dll = NULL;
return HGIMGPROC_ERR_FAIL;
}
if (0 == m_refCount)
{
//HWOCR_InitPdf();
2022-05-11 09:19:50 +00:00
}
++m_refCount;
return HGBASE_ERR_OK;
}
HGResult HGOCRHanvon::Deinit()
{
if (NULL == m_ocrHandle)
{
return HGBASE_ERR_FAIL;
}
2022-08-23 03:06:18 +00:00
ClearImageList();
2022-05-11 09:19:50 +00:00
assert(0 != m_refCount);
--m_refCount;
if (0 == m_refCount)
{
//HWOCR_ExitPdf();
2022-05-11 09:19:50 +00:00
}
HWOCR_SDKExit(m_ocrHandle);
m_ocrHandle = NULL;
HGBase_DestroyDll(m_dll);
m_dll = NULL;
return HGBASE_ERR_OK;
}
HGResult HGOCRHanvon::ImageOCR(HGImage image, class HGOCRRetImpl **ocrRet)
{
if (NULL == image || NULL == ocrRet)
{
return HGBASE_ERR_INVALIDARG;
}
HGChar tmpFileName[256];
HGBase_GetTmpFileName("bmp", tmpFileName, 256);
2022-05-11 09:19:50 +00:00
HGImgFmt_SaveBmpImage(image, NULL, tmpFileName);
char* rst = NULL;
int len = 0;
int ret = HWOCR_RecognizeFile2Str((unsigned char*)tmpFileName, m_ocrHandle, &rst, &len);
if (0 != ret)
{
HGBase_DeleteFile(tmpFileName);
return HGIMGPROC_ERR_FAIL;
}
assert(NULL != rst && len > 0);
HGBase_DeleteFile(tmpFileName);
std::vector<std::string> blockInfo;
blockInfo.push_back(rst);
HWOCR_FreeStrRst(&rst);
*ocrRet = new HGOCRRetImpl(blockInfo);
return HGBASE_ERR_OK;
}
HGResult HGOCRHanvon::ImageOCRToFile(HGImage image, HGUInt outType, const HGChar *outFileName)
{
if (NULL == image || outType > HGIMGPROC_OCROUTTYPE_OFD || NULL == outFileName)
2022-05-11 09:19:50 +00:00
{
return HGBASE_ERR_INVALIDARG;
}
if (0 == outType)
outType = GetOutTypeByFileName(outFileName);
2022-05-11 09:19:50 +00:00
int fileType = -1;
if (HGIMGPROC_OCROUTTYPE_RTF == outType)
2022-05-11 09:19:50 +00:00
fileType = FILE_RTF;
else if (HGIMGPROC_OCROUTTYPE_XLS == outType)
fileType = FILE_XLS;
else if (HGIMGPROC_OCROUTTYPE_TXT == outType)
fileType = FILE_TXT;
else if (HGIMGPROC_OCROUTTYPE_PDF == outType)
fileType = FILE_PDF;
2022-05-11 09:19:50 +00:00
else if (HGIMGPROC_OCROUTTYPE_OFD == outType)
fileType = FILE_OFD;
if (-1 == fileType)
{
return HGBASE_ERR_INVALIDARG;
}
2022-05-11 09:19:50 +00:00
HGChar tmpFileName[256];
HGBase_GetTmpFileName("bmp", tmpFileName, 256);
2022-05-11 09:19:50 +00:00
HGImgFmt_SaveBmpImage(image, NULL, tmpFileName);
HGChar tmpDir[256];
HGBase_GetTmpPath(tmpDir, 256);
int ret = HWOCR_RecognizeFile((unsigned char*)tmpFileName, (unsigned char*)outFileName, fileType, m_ocrHandle, NULL, tmpDir);
if (0 != ret)
{
HGBase_DeleteFile(tmpFileName);
return HGIMGPROC_ERR_FAIL;
}
HGBase_DeleteFile(tmpFileName);
return HGBASE_ERR_OK;
}
HGResult HGOCRHanvon::ImageTextDirectOCR(HGImage image, HGUInt* direct)
{
if (NULL == image || NULL == direct)
{
return HGBASE_ERR_INVALIDARG;
}
HGChar tmpFileName[256];
HGBase_GetTmpFileName("bmp", tmpFileName, 256);
2022-05-11 09:19:50 +00:00
HGImgFmt_SaveBmpImage(image, NULL, tmpFileName);
int dire = -1;
int ret = HWOCR_GetFileDirect((unsigned char*)tmpFileName, m_ocrHandle, &dire);
if (0 != ret)
{
HGBase_DeleteFile(tmpFileName);
return HGIMGPROC_ERR_FAIL;
}
if (ROT0 == dire)
*direct = HGIMGPROC_OCRTEXTDIRECT_ORI;
2022-05-11 09:19:50 +00:00
else if (ROT90 == dire)
*direct = HGIMGPROC_OCRTEXTDIRECT_RIGHT;
else if (ROT180 == dire)
*direct = HGIMGPROC_OCRTEXTDIRECT_180;
else if (ROT270 == dire)
*direct = HGIMGPROC_OCRTEXTDIRECT_LEFT;
HGBase_DeleteFile(tmpFileName);
return HGBASE_ERR_OK;
}
2022-08-23 03:06:18 +00:00
HGResult HGOCRHanvon::AddToImageList(HGImage image)
{
if (NULL == image)
{
return HGBASE_ERR_INVALIDARG;
}
HGChar tmpFileName[256] = {0};
HGBase_GetTmpFileName("jpg", tmpFileName, 256);
HGResult ret = HGImgFmt_SaveJpegImage(image, NULL, tmpFileName);
if (HGBASE_ERR_OK != ret)
{
return ret;
}
m_imageList.push_back(tmpFileName);
return HGBASE_ERR_OK;
}
HGResult HGOCRHanvon::ClearImageList()
{
for (int i = 0; i < (int)m_imageList.size(); ++i)
{
HGBase_DeleteFile(m_imageList[i].c_str());
}
m_imageList.clear();
return HGBASE_ERR_OK;
}
HGResult HGOCRHanvon::ImageListOCRToFile(HGUInt outType, const HGChar* outFileName, HGImageListOcrFunc func, HGPointer param)
{
if (outType > HGIMGPROC_OCROUTTYPE_OFD || NULL == outFileName)
{
return HGBASE_ERR_INVALIDARG;
}
if (0 == outType)
outType = GetOutTypeByFileName(outFileName);
int fileType = -1;
if (HGIMGPROC_OCROUTTYPE_RTF == outType)
fileType = FILE_RTF;
else if (HGIMGPROC_OCROUTTYPE_XLS == outType)
fileType = FILE_XLS;
else if (HGIMGPROC_OCROUTTYPE_TXT == outType)
fileType = FILE_TXT;
else if (HGIMGPROC_OCROUTTYPE_PDF == outType)
fileType = FILE_PDF;
else if (HGIMGPROC_OCROUTTYPE_OFD == outType)
fileType = FILE_OFD;
if (-1 == fileType)
{
return HGBASE_ERR_INVALIDARG;
}
if (m_imageList.empty())
{
return HGBASE_ERR_FAIL;
}
m_OCR = this;
m_func = func;
m_param = param;
HGChar** ppImageFiles = new HGChar* [m_imageList.size() + 1];
for (int i = 0; i < (int)m_imageList.size(); ++i)
ppImageFiles[i] = (HGChar *)m_imageList[i].c_str();
ppImageFiles[m_imageList.size()] = NULL;
HGChar tmpDir[256];
HGBase_GetTmpPath(tmpDir, 256);
#if defined(HG_CMP_MSC)
int ret = HWOCR_RecognizeFileBatch(ppImageFiles, (unsigned char*)outFileName, fileType, m_ocrHandle, NULL, tmpDir, RecogProgress, IsCanceled);
#else
int ret = HWOCR_RecognizeFileBatch(ppImageFiles, (unsigned char*)outFileName, fileType, m_ocrHandle, NULL, tmpDir);
#endif
if (0 != ret)
{
delete[] ppImageFiles;
m_param = NULL;
m_func = NULL;
m_OCR = NULL;
return HGIMGPROC_ERR_FAIL;
}
delete[] ppImageFiles;
m_param = NULL;
m_func = NULL;
m_OCR = NULL;
return HGBASE_ERR_OK;
}
2022-05-11 09:19:50 +00:00
int HGOCRHanvon::HWOCR_SDKInitialize(void** ppstOcrHandle)
{
typedef int (*Func)(void**);
Func func = NULL;
HGBase_GetDllProcAddress(m_dll, "HWOCR_SDKInitialize", (HGPointer *)&func);
if (NULL == func)
{
return -1;
}
return func(ppstOcrHandle);
}
void HGOCRHanvon::HWOCR_SDKExit(void* pstOcrHandle)
{
typedef void (*Func)(void*);
Func func = NULL;
HGBase_GetDllProcAddress(m_dll, "HWOCR_SDKExit", (HGPointer*)&func);
if (NULL == func)
{
return;
}
2022-05-12 08:55:22 +00:00
func(pstOcrHandle);
2022-05-11 09:19:50 +00:00
}
void HGOCRHanvon::HWOCR_InitPdf()
{
typedef void (*Func)();
Func func = NULL;
HGBase_GetDllProcAddress(m_dll, "HWOCR_InitPdf", (HGPointer*)&func);
if (NULL == func)
{
return;
}
2022-05-12 08:55:22 +00:00
func();
2022-05-11 09:19:50 +00:00
}
void HGOCRHanvon::HWOCR_ExitPdf()
{
typedef void (*Func)();
Func func = NULL;
HGBase_GetDllProcAddress(m_dll, "HWOCR_ExitPdf", (HGPointer*)&func);
if (NULL == func)
{
return;
}
2022-05-12 08:55:22 +00:00
func();
2022-05-11 09:19:50 +00:00
}
int HGOCRHanvon::HWOCR_RecognizeFile2Str(unsigned char* ImgFile, void* pstHandle, char** ppRst, int* pnLen)
{
typedef int (*Func)(unsigned char*, void*, char**, int*);
Func func = NULL;
HGBase_GetDllProcAddress(m_dll, "HWOCR_RecognizeFile2Str", (HGPointer*)&func);
if (NULL == func)
{
return -1;
}
return func(ImgFile, pstHandle, ppRst, pnLen);
}
void HGOCRHanvon::HWOCR_FreeStrRst(char** ppRst)
{
typedef void (*Func)(char**);
Func func = NULL;
HGBase_GetDllProcAddress(m_dll, "HWOCR_FreeStrRst", (HGPointer*)&func);
if (NULL == func)
{
return;
}
2022-05-12 08:55:22 +00:00
func(ppRst);
2022-05-11 09:19:50 +00:00
}
int HGOCRHanvon::HWOCR_RecognizeFile(unsigned char* ImgFile, unsigned char* OutFile, int nFileType, void* pstHandle, char* pLibDir, char* pTmpDir)
{
typedef int (*Func)(unsigned char*, unsigned char*, int, void*, char*, char*);
Func func = NULL;
HGBase_GetDllProcAddress(m_dll, "HWOCR_RecognizeFile", (HGPointer*)&func);
if (NULL == func)
{
return -1;
}
return func(ImgFile, OutFile, nFileType, pstHandle, pLibDir, pTmpDir);
}
int HGOCRHanvon::HWOCR_GetFileDirect(unsigned char* ImgFile, void* pstHandle, int* pDirect)
{
typedef int (*Func)(unsigned char*, void *, int *);
Func func = NULL;
HGBase_GetDllProcAddress(m_dll, "HWOCR_GetFileDirect", (HGPointer*)&func);
if (NULL == func)
{
return -1;
}
return func(ImgFile, pstHandle, pDirect);
}
2022-08-23 03:06:18 +00:00
#if defined(HG_CMP_MSC)
int HGOCRHanvon::HWOCR_RecognizeFileBatch(char** ppImageFiles, unsigned char* OutFile, int nFileType, void* pstHandle, char* pLibDir, char* pTmpDir,
HWOCR_RecogProgress aFuncRecogProgress, HWOCR_IsCanceled aFuncIsCanceled)
{
typedef int (*Func)(char**, unsigned char*, int, void*, char*, char*, HWOCR_RecogProgress, HWOCR_IsCanceled);
Func func = NULL;
HGBase_GetDllProcAddress(m_dll, "HWOCR_RecognizeFileBatch", (HGPointer*)&func);
if (NULL == func)
{
return -1;
}
return func(ppImageFiles, OutFile, nFileType, pstHandle, pLibDir, pTmpDir, aFuncRecogProgress, aFuncIsCanceled);
}
#else
int HGOCRHanvon::HWOCR_RecognizeFileBatch(char** ppImageFiles, unsigned char* OutFile, int nFileType, void* pstHandle, char* pLibDir, char* pTmpDir)
{
typedef int (*Func)(char**, unsigned char*, int, void*, char*, char*);
Func func = NULL;
HGBase_GetDllProcAddress(m_dll, "HWOCR_RecognizeFileBatch", (HGPointer*)&func);
if (NULL == func)
{
return -1;
}
return func(ppImageFiles, OutFile, nFileType, pstHandle, pLibDir, pTmpDir);
}
#endif
#if defined(HG_CMP_MSC)
int HGOCRHanvon::RecogProgress(int nPercent)
{
if (NULL != m_OCR->m_func)
m_OCR->m_FuncRet = m_OCR->m_func((HGUInt)m_OCR->m_imageList.size(), (HGUInt)nPercent, m_OCR->m_param);
return 0;
}
int HGOCRHanvon::IsCanceled()
{
if (0 != m_OCR->m_FuncRet)
return 1;
return 0;
}
#endif