增加多页OCR功能

This commit is contained in:
luoliangyi 2022-08-23 11:06:18 +08:00
parent 51041d5938
commit bda7f11f7e
6 changed files with 223 additions and 2 deletions

View File

@ -19,3 +19,6 @@ HGImgProc_GetOCRRetBlockCount
HGImgProc_GetOCRRetBlockText
HGImgProc_ImageOCRToFile
HGImgProc_ImageTextDirectOCR
HGImgProc_AddToImageOCRList
HGImgProc_ClearImageOCRList
HGImgProc_ImageListOCRToFile

View File

@ -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);
}

View File

@ -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__ */

View File

@ -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);

View File

@ -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

View File

@ -7,6 +7,8 @@
#include "../base/HGImage.h"
#include "../base/HGDll.h"
#include "hanwangOCRdetect.h"
#include <vector>
#include <string>
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<std::string> m_imageList;
HGImageListOcrFunc m_func;
HGPointer m_param;
HGInt m_FuncRet;
};
#endif /* __HGOCRHANVON_HPP__ */