/* * ==================================================== * 功能:装订孔填充 * 作者:刘丁维 * 生成时间: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。 * 版本号:v1.9.2 * ==================================================== */ #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& 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 > filterPoly(std::vector>& contours, std::vector& m, cv::RotatedRect roi, cv::Vec4f edgeScale, float sideLengthLow); cv::Scalar getBackGroudColor(const cv::Mat& image, const std::vector pixelPoints); cv::Scalar getBackGroudColor(const cv::Mat& image, int total); uchar getBackGroudChannelMean(const cv::Mat& gray, int total); private: float m_borderSize; cv::Vec4f m_edgeScale; double m_threshold; }; #endif // !IMAGE_APPLY_OUT_HOLE_H