imgproc库中集成除穿孔算法
This commit is contained in:
parent
150908d1c8
commit
71ae9ebcaf
|
@ -14,6 +14,7 @@ HGImgProc_ImageColorRecognition
|
|||
HGImgProc_ImageDispersion
|
||||
HGImgProc_ImageFadeBkColor
|
||||
HGImgProc_ImageFilter
|
||||
HGImgProc_ImageOutHole
|
||||
|
||||
HGImgProc_CreateOCRMgr
|
||||
HGImgProc_DestroyOCRMgr
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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__ */
|
Loading…
Reference in New Issue