code_device/hgdriver/ImageProcess/ImageApplyOutHole.h

95 lines
3.4 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* ====================================================
* 功能:装订孔填充
* 作者:刘丁维
* 生成时间2020/11/21
* 最近修改时间2020/05/12 v1.0
* 2020/11/17 v1.1
* 2021/09/06 v1.2 调整默认二值化阈值从原来的50调整为100。将填充颜色从局部颜色提取改为全局颜色提取。
* 2021/11/03 v1.3 增加逻辑如果正反面图像尺寸差异超过10个像素直接返回不再进行除穿孔处理。
* 2021/11/04 v1.4 增加背景抗噪机制能够抗5像素的背景噪声。
* 2021/11/17 v1.5 调整代码格式避免一些由于opencv版本导致的BUG。
* 2022/04/18 v1.6 修复由于图像超出边界导致的定位孔洞异常的BUG。
* 2022/05/04 v1.6.1 增加逻辑判断,如果出现黑图,直接返回,不对原图进行任何处理。
* 2022/07/16 v1.6.2 修复自动识别填充颜色的BUG
* 2022/07/18 v1.6.3 修复mask的一些逻辑错误
* 2022/07/18 v1.7 修复逻辑BUG替换构造函数borderSize逻辑,由原来面积改为边长,定义穿孔范围为[borderSize, borderSize * 6]
* 2022/07/22 v1.7.1 修复自动识别填充颜色的BUG
* 2022/08/02 v1.7.2 调整部分默认参数以及参数命名
* 2022/09/07 v1.8 去掉上下左右边缘范围的统一比例,取而代之是分别设置上下左右的边缘比例
* 2022/09/09 v1.8.1 修复边缘定位的精确BUG。
* 2022/09/15 v1.8.2 修复一些逻辑BUG。
* 2022/09/15 v1.8.3 提高抗背景噪声能力。
* 2022/09/15 v1.8.4 修复导致崩溃的BUG
* 2022/09/16 v1.9 优化内存消耗
* 2022/09/16 v1.9.1 修复缩放比例的逻辑错误。
* 2022/11/17 v1.9.2 修复寻找孔洞轮廓BUG。
* 2023/05/16 v1.9.3 修复提取纸张最大轮廓的逻辑BUG。
* 2023/11/18 v1.10 替换形态学膨胀孔洞轮廓,改为特征矩阵膨胀轮廓说
* 2023/11/28 v1.10.1 形态学kSize根据borderSize调整
* 版本号v1.10.1
* ====================================================
*/
#ifndef IMAGE_APPLY_OUT_HOLE_H
#define IMAGE_APPLY_OUT_HOLE_H
#include "ImageApply.h"
class GIMGPROC_LIBRARY_API CImageApplyOutHole : public CImageApply
{
public:
CImageApplyOutHole();
/*
* borderSize [in]:孔洞边长阈值
* edgeScale [in]:纸张边缘区域比例。依次表示为上下左右边距比例。取值范围[0, 0.5]默认值0.1 0.1 0.1 0.1)。穿孔会在该指定的边缘区域进行寻找。
* threshold [in]:二值化阈值
*/
CImageApplyOutHole(float borderSize, cv::Vec4f edgeScale, double threshold);
~CImageApplyOutHole(void);
virtual void apply(std::vector<cv::Mat>& mats, bool isTwoSide);
float getBorderSize() { return m_borderSize; }
cv::Vec4f getEdgeScale() { return m_edgeScale; }
double getThreshold() { return m_threshold; }
void setBorderSize(float size) { m_borderSize = size; }
void setEdgeScale(float scale) { m_edgeScale = scale; }
void setThreshold(double threshold) { m_threshold = (std::min)((std::max)(threshold, 1.0), 254.0); }
private:
virtual void apply(cv::Mat& pDib, int side);
void getRoi(cv::RotatedRect rrect_front, cv::RotatedRect rrect_back, const cv::Size& srcSize_front, const cv::Size& srcSize_back, cv::Rect& roi_front,
cv::Rect& roi_back, cv::RotatedRect& mask_rotatedRect);
std::vector<std::vector<cv::Point> > filterPoly(std::vector<std::vector<cv::Point>>& contours, std::vector<cv::Vec4i>& m, cv::RotatedRect roi,
cv::Vec4f edgeScale, float sideLengthLow);
cv::Scalar getBackGroudColor(const cv::Mat& image, const std::vector<cv::Point> pixelPoints);
cv::Scalar getBackGroudColor(const cv::Mat& image, int total);
uchar getBackGroudChannelMean(const cv::Mat& gray, int total);
void dilateContour(std::vector<cv::Point>& contour, int distance);
private:
float m_borderSize;
cv::Vec4f m_edgeScale;
double m_threshold;
};
#endif // !IMAGE_APPLY_OUT_HOLE_H