diff --git a/build/windows/HGImgProc/HGImgProc.def b/build/windows/HGImgProc/HGImgProc.def index 0f9795a4..2ab94383 100644 --- a/build/windows/HGImgProc/HGImgProc.def +++ b/build/windows/HGImgProc/HGImgProc.def @@ -19,3 +19,6 @@ HGImgProc_GetOCRRetBlockCount HGImgProc_GetOCRRetBlockText HGImgProc_ImageOCRToFile HGImgProc_ImageTextDirectOCR +HGImgProc_AddToImageOCRList +HGImgProc_ClearImageOCRList +HGImgProc_ImageListOCRToFile diff --git a/modules/imgproc/HGOCR.cpp b/modules/imgproc/HGOCR.cpp index 83a0a5a2..e0790b94 100644 --- a/modules/imgproc/HGOCR.cpp +++ b/modules/imgproc/HGOCR.cpp @@ -114,4 +114,37 @@ HGResult HGAPI HGImgProc_ImageTextDirectOCR(HGOCRMgr ocrMgr, HGImage image, HGUI HGOCRBase* ocrMgrImpl = (HGOCRBase*)ocrMgr; return ocrMgrImpl->ImageTextDirectOCR(image, direct); +} + +HGResult HGAPI HGImgProc_AddToImageOCRList(HGOCRMgr ocrMgr, HGImage image) +{ + if (NULL == ocrMgr) + { + return HGBASE_ERR_INVALIDARG; + } + + HGOCRBase* ocrMgrImpl = (HGOCRBase*)ocrMgr; + return ocrMgrImpl->AddToImageList(image); +} + +HGResult HGAPI HGImgProc_ClearImageOCRList(HGOCRMgr ocrMgr) +{ + if (NULL == ocrMgr) + { + return HGBASE_ERR_INVALIDARG; + } + + HGOCRBase* ocrMgrImpl = (HGOCRBase*)ocrMgr; + return ocrMgrImpl->ClearImageList(); +} + +HGResult HGAPI HGImgProc_ImageListOCRToFile(HGOCRMgr ocrMgr, HGUInt outType, const HGChar* outFileName, HGImageListOcrFunc func, HGPointer param) +{ + if (NULL == ocrMgr) + { + return HGBASE_ERR_INVALIDARG; + } + + HGOCRBase* ocrMgrImpl = (HGOCRBase*)ocrMgr; + return ocrMgrImpl->ImageListOCRToFile(outType, outFileName, func, param); } \ No newline at end of file diff --git a/modules/imgproc/HGOCR.h b/modules/imgproc/HGOCR.h index 577cc17f..03921161 100644 --- a/modules/imgproc/HGOCR.h +++ b/modules/imgproc/HGOCR.h @@ -29,6 +29,10 @@ HG_DECLARE_HANDLE(HGOCRRet); /* 旋转了180度 */ #define HGIMGPROC_OCRTEXTDIRECT_180 4L +/* 多页OCR进度 +*/ +typedef HGInt (*HGImageListOcrFunc)(HGUInt total, HGUInt now, HGPointer param); + /* 初始化OCR模块 */ HGEXPORT HGResult HGAPI HGImgProc_CreateOCRMgr(HGOCRMgr *ocrMgr); @@ -61,4 +65,16 @@ HGEXPORT HGResult HGAPI HGImgProc_ImageOCRToFile(HGOCRMgr ocrMgr, HGImage image, */ HGEXPORT HGResult HGAPI HGImgProc_ImageTextDirectOCR(HGOCRMgr ocrMgr, HGImage image, HGUInt *direct); +/* 添加到图像OCR列表 +*/ +HGEXPORT HGResult HGAPI HGImgProc_AddToImageOCRList(HGOCRMgr ocrMgr, HGImage image); + +/* 清理图像OCR列表 +*/ +HGEXPORT HGResult HGAPI HGImgProc_ClearImageOCRList(HGOCRMgr ocrMgr); + +/* 图像列表OCR到文件 +*/ +HGEXPORT HGResult HGAPI HGImgProc_ImageListOCRToFile(HGOCRMgr ocrMgr, HGUInt outType, const HGChar* outFileName, HGImageListOcrFunc func, HGPointer param); + #endif /* __HGOCR_H__ */ \ No newline at end of file diff --git a/modules/imgproc/HGOCRBase.hpp b/modules/imgproc/HGOCRBase.hpp index 67314263..5003c537 100644 --- a/modules/imgproc/HGOCRBase.hpp +++ b/modules/imgproc/HGOCRBase.hpp @@ -1,8 +1,7 @@ #ifndef __HGOCRBASE_H__ #define __HGOCRBASE_H__ -#include "../base/HGDef.h" -#include "../base/HGImage.h" +#include "HGOCR.h" class HGOCRBase { @@ -15,6 +14,9 @@ public: virtual HGResult ImageOCR(HGImage image, class HGOCRRetImpl **ocrRet) = 0; virtual HGResult ImageOCRToFile(HGImage image, HGUInt outType, const HGChar *outFileName) = 0; virtual HGResult ImageTextDirectOCR(HGImage image, HGUInt* direct) = 0; + virtual HGResult AddToImageList(HGImage image) = 0; + virtual HGResult ClearImageList() = 0; + virtual HGResult ImageListOCRToFile(HGUInt outType, const HGChar* outFileName, HGImageListOcrFunc func, HGPointer param) = 0; protected: static HGUInt GetOutTypeByFileName(const HGChar* fileName); diff --git a/modules/imgproc/HGOCRHanvon.cpp b/modules/imgproc/HGOCRHanvon.cpp index eb451b6f..573a13a7 100644 --- a/modules/imgproc/HGOCRHanvon.cpp +++ b/modules/imgproc/HGOCRHanvon.cpp @@ -5,13 +5,19 @@ #include "../base/HGUtility.h" #include "../base/HGInfo.h" #include "../imgfmt/HGBmp.h" +#include "../imgfmt/HGJpeg.h" HGUInt HGOCRHanvon::m_refCount = 0; +HGOCRHanvon* HGOCRHanvon::m_OCR = NULL; HGOCRHanvon::HGOCRHanvon() { m_dll = NULL; m_ocrHandle = NULL; + m_imageList.clear(); + m_func = NULL; + m_param = NULL; + m_FuncRet = 0; } HGOCRHanvon::~HGOCRHanvon() @@ -69,6 +75,8 @@ HGResult HGOCRHanvon::Deinit() return HGBASE_ERR_FAIL; } + ClearImageList(); + assert(0 != m_refCount); --m_refCount; if (0 == m_refCount) @@ -190,6 +198,99 @@ HGResult HGOCRHanvon::ImageTextDirectOCR(HGImage image, HGUInt* direct) return HGBASE_ERR_OK; } +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; +} + int HGOCRHanvon::HWOCR_SDKInitialize(void** ppstOcrHandle) { typedef int (*Func)(void**); @@ -293,3 +394,48 @@ int HGOCRHanvon::HWOCR_GetFileDirect(unsigned char* ImgFile, void* pstHandle, in return func(ImgFile, pstHandle, pDirect); } + +#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 diff --git a/modules/imgproc/HGOCRHanvon.hpp b/modules/imgproc/HGOCRHanvon.hpp index fcafaa6e..e8986be7 100644 --- a/modules/imgproc/HGOCRHanvon.hpp +++ b/modules/imgproc/HGOCRHanvon.hpp @@ -7,6 +7,8 @@ #include "../base/HGImage.h" #include "../base/HGDll.h" #include "hanwangOCRdetect.h" +#include +#include class HGOCRHanvon : public HGOCRBase { @@ -19,6 +21,9 @@ public: HGResult ImageOCR(HGImage image, class HGOCRRetImpl **ocrRet); HGResult ImageOCRToFile(HGImage image, HGUInt outType, const HGChar *outFileName); HGResult ImageTextDirectOCR(HGImage image, HGUInt* direct); + HGResult AddToImageList(HGImage image); + HGResult ClearImageList(); + HGResult ImageListOCRToFile(HGUInt outType, const HGChar* outFileName, HGImageListOcrFunc func, HGPointer param); private: int HWOCR_SDKInitialize(void** ppstOcrHandle); @@ -29,11 +34,27 @@ private: void HWOCR_FreeStrRst(char** ppRst); int HWOCR_RecognizeFile(unsigned char* ImgFile, unsigned char* OutFile, int nFileType, void* pstHandle, char* pLibDir, char* pTmpDir); int HWOCR_GetFileDirect(unsigned char* ImgFile, void* pstHandle, int* pDirect); +#if defined(HG_CMP_MSC) + int HWOCR_RecognizeFileBatch(char** ppImageFiles, unsigned char* OutFile, int nFileType, void* pstHandle, char* pLibDir, char* pTmpDir, + HWOCR_RecogProgress aFuncRecogProgress, HWOCR_IsCanceled aFuncIsCanceled); +#else + int HWOCR_RecognizeFileBatch(char** ppImageFiles, unsigned char* OutFile, int nFileType, void* pstHandle, char* pLibDir, char* pTmpDir); +#endif + +#if defined(HG_CMP_MSC) + static int RecogProgress(int nPercent); + static int IsCanceled(); +#endif private: static HGUInt m_refCount; + static HGOCRHanvon* m_OCR; HGDll m_dll; void* m_ocrHandle; + std::vector m_imageList; + HGImageListOcrFunc m_func; + HGPointer m_param; + HGInt m_FuncRet; }; #endif /* __HGOCRHANVON_HPP__ */ \ No newline at end of file