imgproc库中集成除穿孔算法

This commit is contained in:
luoliangyi 2022-06-20 11:06:18 +08:00
parent 150908d1c8
commit 71ae9ebcaf
3 changed files with 118 additions and 14 deletions

View File

@ -14,6 +14,7 @@ HGImgProc_ImageColorRecognition
HGImgProc_ImageDispersion
HGImgProc_ImageFadeBkColor
HGImgProc_ImageFilter
HGImgProc_ImageOutHole
HGImgProc_CreateOCRMgr
HGImgProc_DestroyOCRMgr

View File

@ -8,6 +8,7 @@
#include "./ImageProcess/ImageApplyDispersion.h"
#include "./ImageProcess/ImageApplyFadeBackGroundColor.h"
#include "./ImageProcess/ImageApplyFilter.h"
#include "./ImageProcess/ImageApplyOutHole.h"
#include "CvxText.hpp"
#include "../base/HGInc.h"
#include "../base/HGUtility.h"
@ -756,7 +757,7 @@ HGResult HGAPI HGImgProc_ImageColorRecognition(HGImage image, HGUInt* colorType)
{
for (HGUInt w = 0; w < roiWidth; ++w)
{
uint8_t *pData = p + imgInfo.widthStep * h + w;
uint8_t *pData = p + imgInfo.widthStep * h + w * channels;
if (0 != *pData && 255 != *pData)
{
*colorType = HGIMGPROC_COLORTYPE_GRAY;
@ -780,7 +781,7 @@ HGResult HGAPI HGImgProc_ImageColorRecognition(HGImage image, HGUInt* colorType)
return ret;
}
cv::Mat img(roiHeight, roiWidth, CV_8UC(3), p, imgInfo.widthStep);
cv::Mat img(roiHeight, roiWidth, CV_8UC(channels), p, imgInfo.widthStep);
CImageApplyColorRecognition imgApply(CImageApplyColorRecognition::AllColor);
imgApply.apply(img, 0);
@ -1083,7 +1084,7 @@ HGResult HGAPI HGImgProc_ImageFilter(HGImage image, HGImage destImage, HGUInt fi
{
for (HGUInt i = 0; i < roiHeight; ++i)
{
memcpy(p + i * imgInfo.widthStep, img.data + i * img.step, roiWidth);
memcpy(p + i * imgInfo.widthStep, img.data + i * img.step, roiWidth * channels);
}
}
}
@ -1141,10 +1142,98 @@ HGResult HGAPI HGImgProc_ImageFilter(HGImage image, HGImage destImage, HGUInt fi
{
for (HGUInt i = 0; i < destRoiHeight; ++i)
{
memcpy(pDest + i * destImgInfo.widthStep, destImg.data + i * destImg.step, destRoiWidth);
memcpy(pDest + i * destImgInfo.widthStep, destImg.data + i * destImg.step, destRoiWidth * channels);
}
}
}
return HGBASE_ERR_OK;
}
HGResult HGAPI HGImgProc_ImageOutHole(HGImage image1, HGImage image2, HGFloat borderSize, HGFloat edgeScale, HGDouble threshold)
{
if (NULL == image1 || NULL == image2 || image1 == image2)
{
return HGBASE_ERR_INVALIDARG;
}
HGImageInfo imgInfo1;
HGBase_GetImageInfo(image1, &imgInfo1);
HGImageInfo imgInfo2;
HGBase_GetImageInfo(image2, &imgInfo2);
if (imgInfo1.type != imgInfo2.type || imgInfo1.origin != imgInfo2.origin)
{
return HGBASE_ERR_INVALIDDATA;
}
HGByte* data1 = NULL;
HGBase_GetImageData(image1, &data1);
HGByte* data2 = NULL;
HGBase_GetImageData(image2, &data2);
HGImageRoi roi1;
HGBase_GetImageROI(image1, &roi1);
HGUInt roiWidth1 = roi1.right - roi1.left;
HGUInt roiHeight1 = roi1.bottom - roi1.top;
HGImageRoi roi2;
HGBase_GetImageROI(image2, &roi2);
HGUInt roiWidth2 = roi2.right - roi2.left;
HGUInt roiHeight2 = roi2.bottom - roi2.top;
if (roiWidth1 != roiWidth2 || roiHeight1 != roiHeight2)
{
return HGBASE_ERR_INVALIDDATA;
}
if (HGBASE_IMGTYPE_BINARY == imgInfo1.type || HGBASE_IMGTYPE_RGBA == imgInfo1.type
|| HGBASE_IMGTYPE_BGRA == imgInfo1.type || HGBASE_IMGTYPE_RGB == imgInfo1.type)
{
HGImage imageTmp1 = NULL;
HGResult ret = HGBase_CloneImage(image1, HGBASE_IMGTYPE_BGR, 0, &imageTmp1);
if (HGBASE_ERR_OK == ret)
{
HGImage imageTmp2 = NULL;
ret = HGBase_CloneImage(image2, HGBASE_IMGTYPE_BGR, 0, &imageTmp2);
if (HGBASE_ERR_OK == ret)
{
ret = HGImgProc_ImageOutHole(imageTmp1, imageTmp2, borderSize, edgeScale, threshold);
if (HGBASE_ERR_OK == ret)
{
HGBase_CopyImage(imageTmp1, image1);
HGBase_CopyImage(imageTmp2, image2);
}
HGBase_DestroyImage(imageTmp2);
}
HGBase_DestroyImage(imageTmp1);
}
return ret;
}
uint32_t channels = 1;
if (HGBASE_IMGTYPE_BGR == imgInfo1.type || HGBASE_IMGTYPE_RGB == imgInfo1.type)
channels = 3;
else if (HGBASE_IMGTYPE_BGRA == imgInfo1.type || HGBASE_IMGTYPE_RGBA == imgInfo1.type)
channels = 4;
uint8_t* p1 = data1 + roi1.top * imgInfo1.widthStep + roi1.left * channels;
if (HGBASE_IMGORIGIN_BOTTOM == imgInfo1.origin)
p1 = data1 + (imgInfo1.height - roi1.bottom) * imgInfo1.widthStep + roi1.left * channels;
cv::Mat img1(roiHeight1, roiWidth1, CV_8UC(channels), p1, imgInfo1.widthStep);
uint8_t* p2 = data2 + roi2.top * imgInfo2.widthStep + roi2.left * channels;
if (HGBASE_IMGORIGIN_BOTTOM == imgInfo2.origin)
p2 = data2 + (imgInfo2.height - roi2.bottom) * imgInfo2.widthStep + roi2.left * channels;
cv::Mat img2(roiHeight2, roiWidth2, CV_8UC(channels), p2, imgInfo2.widthStep);
std::vector<cv::Mat> mats;
mats.push_back(img1);
mats.push_back(img2);
CImageApplyOutHole imgApply(borderSize, edgeScale, threshold);
imgApply.apply(mats, true);
assert(mats[0].data == p1);
assert(mats[1].data == p2);
return HGBASE_ERR_OK;
}

View File

@ -112,12 +112,12 @@ typedef struct
/* 水印字体参数 */
typedef struct
{
HGChar foneName[64]; /* 字体名, windows上为GBK编码, linux上为UTF8编码 */
HGUInt fontSize; /* 字号 */
HGBool bold; /* 是否粗体 */
HGBool underline; /* 是否有下划线 */
HGBool italic; /* 是否斜体 */
HGBool strikeout; /* 是否有删除线 */
HGChar foneName[64]; /* 字体名, windows上为GBK编码, linux上为UTF8编码, 默认宋体 */
HGUInt fontSize; /* 字号, 默认20 */
HGBool bold; /* 是否粗体, 默认HGFALSE */
HGBool underline; /* 是否有下划线, 默认HGFALSE */
HGBool italic; /* 是否斜体, 默认HGFALSE */
HGBool strikeout; /* 是否有删除线, 默认HGFALSE */
}HGImgWatermarkFontParam;
/* 去底色参数 */
@ -217,9 +217,9 @@ HGEXPORT HGResult HGAPI HGImgProc_AddImageWatermark(HGImage image, const HGChar
* 1) image: in,
* 2) destImage: in,
* 3) thresholdType: in, HGIMGPROC_THRESHTYPE_*
* 4) threshold: in, , HGIMGPROC_THRESHTYPE_OTSU时无效
* 5) blockSize: in, HGIMGPROC_THRESHTYPE_ADAPTIVE_GAUSSIAN和HGIMGPROC_THRESHTYPE_ADAPTIVE_MEAN模式有效
* 6) constant: in, HGIMGPROC_THRESHTYPE_ADAPTIVE_GAUSSIAN和HGIMGPROC_THRESHTYPE_ADAPTIVE_MEAN模式有效blockSize形成比例关系
* 4) threshold: in, , HGIMGPROC_THRESHTYPE_OTSU时无效, 120
* 5) blockSize: in, HGIMGPROC_THRESHTYPE_ADAPTIVE_GAUSSIAN和HGIMGPROC_THRESHTYPE_ADAPTIVE_MEAN模式有效, 51
* 6) constant: in, HGIMGPROC_THRESHTYPE_ADAPTIVE_GAUSSIAN和HGIMGPROC_THRESHTYPE_ADAPTIVE_MEAN模式有效blockSize形成比例关系, 41
* :
* 1) ROI区域, ROI区域的大小必须一致
* 2) type必须一样
@ -276,7 +276,7 @@ HGEXPORT HGResult HGAPI HGImgProc_ImageFadeBkColor(HGImage image, HGImage destIm
* 1) image: in,
* 2) destImage: in,
* 3) filterType: in, , HGIMGPROC_FILTERTYPE_*
* 4) kSize: in, 30
* 4) kSize: in, 30, HGIMGPROC_FILTERTYPE_GAUSSIANBLUR时须为正奇数
* :
* 1) ROI区域, ROI区域的大小必须一致
* 2) type必须一样
@ -285,4 +285,18 @@ HGEXPORT HGResult HGAPI HGImgProc_ImageFadeBkColor(HGImage image, HGImage destIm
*/
HGEXPORT HGResult HGAPI HGImgProc_ImageFilter(HGImage image, HGImage destImage, HGUInt filterType, HGInt kSize);
/* 装订孔填充
* 1) image1: in, 1
* 2) image2: in, 2
* 3) borderSize: in,
* 4) edgeScale: in, (0,0.5),0.1
* 5) threshold: in,
* :
* 1) ROI区域, ROI区域的大小必须一致
* 2) image1和image2的type必须一致
* 3) image1和image2的origin必须一致
* 3) image1和image2不能是同一个句柄
*/
HGEXPORT HGResult HGAPI HGImgProc_ImageOutHole(HGImage image1, HGImage image2, HGFloat borderSize, HGFloat edgeScale, HGDouble threshold);
#endif /* __HGIMGPROC_H__ */