296 lines
6.2 KiB
C++
296 lines
6.2 KiB
C++
#include "HGOCRHanvon.hpp"
|
|
#include "HGOCR.h"
|
|
#include "HGOCRRetImpl.hpp"
|
|
#include "HGOCRRetImpl.hpp"
|
|
#include "../base/HGUtility.h"
|
|
#include "../base/HGInfo.h"
|
|
#include "../imgfmt/HGBmp.h"
|
|
|
|
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];
|
|
HGBase_GetModuleName((void *)HGImgProc_CreateOCRMgr, moduleName, 256);
|
|
HGChar dllPath[256];
|
|
HGBase_GetFilePath(moduleName, dllPath, 256);
|
|
|
|
#if defined(HG_CMP_MSC)
|
|
strcat(dllPath, "hanwangOCRdetect.dll");
|
|
#else
|
|
strcat(dllPath, "libhwocrdetect.so");
|
|
#endif
|
|
HGResult ret = HGBase_CreateDll(dllPath, &m_dll);
|
|
if (HGBASE_ERR_OK != ret)
|
|
{
|
|
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "Load OCR Library Failed, path=%s", dllPath);
|
|
return ret;
|
|
}
|
|
|
|
if (0 != HWOCR_SDKInitialize(&m_ocrHandle))
|
|
{
|
|
HGBase_WriteInfo(HGBASE_INFOTYPE_DESC, "Init OCR Library Failed");
|
|
HGBase_DestroyDll(m_dll);
|
|
m_dll = NULL;
|
|
return HGIMGPROC_ERR_FAIL;
|
|
}
|
|
|
|
if (0 == m_refCount)
|
|
{
|
|
//HWOCR_InitPdf();
|
|
}
|
|
++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();
|
|
}
|
|
|
|
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);
|
|
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)
|
|
{
|
|
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;
|
|
}
|
|
|
|
HGChar tmpFileName[256];
|
|
HGBase_GetTmpFileName("bmp", tmpFileName, 256);
|
|
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);
|
|
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;
|
|
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;
|
|
}
|
|
|
|
func(pstOcrHandle);
|
|
}
|
|
|
|
void HGOCRHanvon::HWOCR_InitPdf()
|
|
{
|
|
typedef void (*Func)();
|
|
Func func = NULL;
|
|
HGBase_GetDllProcAddress(m_dll, "HWOCR_InitPdf", (HGPointer*)&func);
|
|
if (NULL == func)
|
|
{
|
|
return;
|
|
}
|
|
|
|
func();
|
|
}
|
|
|
|
void HGOCRHanvon::HWOCR_ExitPdf()
|
|
{
|
|
typedef void (*Func)();
|
|
Func func = NULL;
|
|
HGBase_GetDllProcAddress(m_dll, "HWOCR_ExitPdf", (HGPointer*)&func);
|
|
if (NULL == func)
|
|
{
|
|
return;
|
|
}
|
|
|
|
func();
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
func(ppRst);
|
|
}
|
|
|
|
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);
|
|
}
|