code_app/modules/imgproc/HGOCRHanvon.cpp

307 lines
6.4 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-05-12 08:55:22 +00:00
template<typename dst_type, typename src_type>
dst_type union_cast(src_type src)
{
union {
src_type s;
dst_type d;
}u;
u.s = src;
return u.d;
}
2022-05-11 09:19:50 +00:00
HGUInt HGOCRHanvon::m_refCount = 0;
HGOCRHanvon::HGOCRHanvon()
{
m_dll = NULL;
m_ocrHandle = NULL;
}
HGOCRHanvon::~HGOCRHanvon()
{
}
HGResult HGOCRHanvon::Init()
{
if (NULL != m_ocrHandle)
{
return HGBASE_ERR_FAIL;
}
assert(NULL == m_dll);
HGChar moduleName[256];
2022-05-12 08:55:22 +00:00
HGBase_GetModuleName(union_cast<void*>(&HGOCRHanvon::Init), 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;
}
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;
}
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);
}