code_device/hgdriver/ImageProcess/ImageApplyAutoCrop.h

140 lines
6.3 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.

/*
* ====================================================
* 功能:自动裁剪、纠偏、除黑底
* 作者:刘丁绿
* 生成时间_020/4/21
* 最近修改时间2020/4/21 v1.0
2020/7/22 v1.1 增加获取图像有效区域轮廓的接口maxContour用于配合一体机的“跳过空白页”算法PC端暂时无需使用_
2020/10/16 v1.2 修复自动裁剪尺寸精度丢失的BUG提高除黑底缩进精度
2020/10/28 v1.2.1 修复凹凸多边形填充背景的逻辑BUG
2020/10/28 v1.2.2 修复图像处理必定会缩小尺寸的BUG
2020/10/29 v1.2.3 避免无谓的纠偏0°纠偏_
2020/11/30 v1.3.0 增加功能,可识别文稿颜色进行填充黑底
2021/06/18 v1.3.1 调整默认noise
2021/07/01 v1.3.2 修复 无裁切情况下自适应颜色除黑底不生效的BUG
2021/07/08 v1.3.3 完善流程。当无法定位内容时,且为固定幅面裁切,则返回按照固定幅面进行裁切的结果
2021/07/08 v1.3.4 调整参数,让消除背景噪声不对纵向像素造成影响
2021/07/09 v1.3.5 增加normalCrop机制当m_isCrop m_isDesaskew m_isFillBlank均为false时可选用实现传统裁切
2021/07/13 v1.3.6 调整normalCrop逻辑当normalCrop为true时m_isCrop m_isDesaskew m_isFillBlank失效
2021/07/19 v1.3.7 调整仿射变换模式为INTER_LINEAR
2021/07/22 v1.3.8 修复第二次寻边找不到外界轮廓会导致崩溃的BUG
2021/08/02 v1.3.9 精细化除黑底算法,可以应对只有条纹内容的黑色图像
2021/10/08 v1.3.10 优化算法,用腐蚀代替绘制实现缩进,提高整体算法效率
2021/10/19 v1.3.11 解决一些极端情况例如纸张自然0角度纸张定格在图像顶部的处理
2021/10/19 v1.3.12 微调裁切纠偏像素精度
2022/04/24 v1.4 重构算法,增加除色散功能
2022/05/03 v1.4.1 完善逻辑
2022/06/09 v1.4.2 修复获取文稿底色时threshold值设为固定值0.5
2022/10/31 v1.5 增加横纵DPI缩放参数fx,fy。
2022/11/19 v1.5.1 修复文稿背景色识别算法的BUG。
2022/11/19 v1.5.2 修复灰度文稿背景色识别算法的BUG。
* 版本号v1.5.2
* ====================================================
*/
#ifndef IMAGE_APPLY_AUTO_CROP_H
#define IMAGE_APPLY_AUTO_CROP_H
#include "ImageApply.h"
class CImageApplyDispersion;
class GIMGPROC_LIBRARY_API CImageApplyAutoCrop : public CImageApply
{
public:
CImageApplyAutoCrop();
/*
* isCrop [in]:自动幅面裁剪使能true自动裁剪false为固定裁剿
* isDesaskew [in]:自动纠偏使能true自动纠偏false为不纠偏
* isFillBlank [in]:黑底填充使能true为填充false为不填充
* fixedSize [in]:固定幅面尺寸当isCrop为false时生效结果尺寸按fixedSize大小输出单位像紿
* isConvex [in]:黑底填充时的填充方式,true为凸多边形填充false为凹多边形填充默认true
* isFillColor [in]:黑底填充时采用自适应色彩填充false为白色填充true为自适应文稿底色填充默认false
* threshold [in]:二值化阈值取值范囿0, 255)默访0
* noise [in]:除噪像素能够消除noise宽度的背景竖条纹干扰默访
* indent [in]:轮廓缩进裁剪、纠偏或者黑底填充时对探索到的纸张轮廓进行缩进indent像素默访
* normalCrop [in]:为true时m_isCrop m_isDesaskew m_isFillBlank失效固定裁切采用最传统的裁切方式默认false
* dispersion [in]:为true时除色散false时不除色散。默认为true
* fx [in]:横向缩放比例。默认1.0
* fy [in]:纵向缩放比例。默认1.0
*/
CImageApplyAutoCrop(bool isCrop, bool isDesaskew, bool isFillBlank, const cv::Size& fixedSize, bool isConvex = true,
bool isFillColor = false, double threshold = 40, int noise = 8, int indent = 5, bool normalCrop = false, bool dispersion = true, double fx = 1.0, double fy = 1.0);
virtual ~CImageApplyAutoCrop();
virtual void apply(cv::Mat& pDib, int side);
virtual void apply(std::vector<cv::Mat>& mats, bool isTwoSide);
bool isAutoCrop() { return m_isCrop; }
bool isFillBlank() { return m_isFillBlank; }
bool isDesaskew() { return m_isDesaskew; }
bool isConvexHull() { return m_isConvexHull; }
cv::RotatedRect getROI() { return m_rect; }
double threshold() { return m_threshold; }
int noise() { return m_noise; }
int indent() { return m_indent; }
cv::Size fixedSize() { return m_fixedSize; }
const std::vector<cv::Point>& maxContour() { return m_maxContour; }
void setAutoCrop(bool enabled) { m_isCrop = enabled; }
void setFillBlank(bool enabled) { m_isFillBlank = enabled; }
void setDesaskew(bool enabled) { m_isDesaskew = enabled; }
void setConvexHull(bool convex) { m_isConvexHull = convex; }
void setThreshold(double value) { m_threshold = value; }
void setNoise(int value) { m_noise = value; }
void setIndent(int value) { m_indent = value; }
void setFixedSize(cv::Size size) { m_fixedSize = size; }
void setDispersion(bool enable) { m_isDispersion = enable; }
static void autoCrop_desaskew_fillBlank(cv::Mat& src, cv::Mat& dst, bool isAutoCrop, bool isDesaskew, bool isFillBlank, int dWidth, int dHeight,
bool isConvex = true, bool isColorBlank = false, double threshold = 40, int noise = 8, int indent = 5, bool isNormalCrop = false, bool dispersion = true,
double fx = 1.0, double fy = 1.0);
private:
static void myWarpAffine(cv::InputArray _src, cv::OutputArray _dst, cv::InputArray _M0, cv::Size dsize, int flags, int borderType, const cv::Scalar& borderValue);
static cv::Scalar getBackGroudColor(const cv::Mat& image, int threshold);
private:
bool m_isCrop;
bool m_isDesaskew;
bool m_isFillBlank;
bool m_isConvexHull;
bool m_isFillColor;
bool m_isDispersion;
double m_threshold;
int m_noise;
int m_indent;
bool m_normalCrop; //为true且m_isCrop m_isDesaskew m_isFillBlank均为false时生效固定裁切采用最传统的裁切方弿
cv::Size m_fixedSize;
cv::RotatedRect m_rect;
std::vector<cv::RotatedRect> m_rects;
std::vector<cv::Point> m_maxContour;
double m_fx;
double m_fy;
};
#endif // !IMAGE_APPLY_AUTO_CROP_H