91 lines
3.4 KiB
C++
91 lines
3.4 KiB
C++
/*
|
||
* ====================================================
|
||
|
||
* 功能:装订孔填充
|
||
* 作者:刘丁维
|
||
* 生成时间:2020/11/21
|
||
* 最近修改时间:v1.0 2020/05/12
|
||
* v1.1 2020/11/17
|
||
* v1.2 2021/09/06 调整默认二值化阈值,从原来的50调整为100。将填充颜色从局部颜色提取改为全局颜色提取。
|
||
* v1.3 2021/11/03 增加逻辑,如果正反面图像尺寸差异超过10个像素,直接返回,不再进行除穿孔处理。
|
||
* v1.4 2021/11/04 增加背景抗噪机制,能够抗5像素的背景噪声。
|
||
* v1.5 2021/11/17 调整代码格式,避免一些由于opencv版本导致的BUG。
|
||
* v1.6 2022/04/18 修复由于图像超出边界导致的定位孔洞异常的BUG。
|
||
* v1.6.1 2022/05/04 增加逻辑判断,如果出现黑图,直接返回,不对原图进行任何处理。
|
||
* v1.6.2 2022/07/16 修复自动识别填充颜色的BUG
|
||
* v1.6.3 2022/07/18 修复mask的一些逻辑错误
|
||
* v1.7 2022/07/18 修复逻辑BUG,替换构造函数borderSize逻辑,由原来面积改为边长,定义穿孔范围为[borderSize, borderSize * 6]
|
||
* v1.7.1 2022/07/22 修复自动识别填充颜色的BUG
|
||
* v1.7.2 2022/08/02 调整部分默认参数以及参数命名
|
||
* v1.8 2022/09/07 去掉上下左右边缘范围的统一比例,取而代之是分别设置上下左右的边缘比例
|
||
* v1.8.1 2022/09/09 修复边缘定位的精确BUG。
|
||
* v1.8.2 2022/09/15 修复一些逻辑BUG。
|
||
* v1.8.3 2022/09/15 提高抗背景噪声能力。
|
||
* v1.8.4 2022/09/15 修复导致崩溃的BUG
|
||
* v1.9 2022/09/16 优化内存消耗
|
||
* v1.9.1 2022/09/16 修复缩放比例的逻辑错误。
|
||
* v1.9.2 2022/11/17 修复寻找孔洞轮廓BUG。
|
||
* v1.9.3 2023/05/16 修复提取纸张最大轮廓的逻辑BUG。
|
||
* v1.10 2023/11/18 替换形态学膨胀孔洞轮廓,改为特征矩阵膨胀轮廓说。
|
||
* v1.10.1 2023/11/28 形态学kSize根据borderSize调整。
|
||
* v1.11 2023/12/02 替换文稿底色提取方案;修复部分孔洞填充不完全的问题。
|
||
* v1.11.1 2023/12/08 增加机制,当发现文稿底色<阈值时,直接返回。避免浪费无意义的算力;增大填涂面积
|
||
* 版本号:v1.11.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);
|
||
|
||
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
|