code_device/hgdriver/ImageProcess/ImageApplyDiscardBlank.h

93 lines
3.5 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/4/21
* 最近修改时间2020/4/21 v1.0
2020/8/12 v1.1 开放setIntensity和setMinArea取消isNormal标识位扩大setIntensity的设置范围从[2, 20]扩大到[1, 100]
2020/8/25 v1.1.1 纸张检测缩进从100像素调整到20像素
2020/10/16 v1.2 添加新接口,能够高效便捷判断图片是否为空白页
2020/10/19 v1.2.1 修复静态空白页判断识别误判的BUG
2021/04/13 v1.3.0 增加标准/票据标识位
2021/08/12 v1.3.1 添加防止不同opencv版本导致计算结果存在差异的代码。
2021/12/14 v1.3.2 重构算法。
2021/12/15 v1.3.3 微调参数。
2021/12/17 v1.3.4 增加背景色接口,实现对纯色纸张的空白页判定
2022/09/07 v1.3.5 修复部分参数传递的BUG
2022/09/19 v1.4 增加模糊处理,提高空白页的过滤能力
2022/09/19 v1.4.1 调整模糊处理步骤
2022/11/18 v1.4.2 调整默认参数
2022/11/29 v1.5 增加纸张杂点忽略功能
2022/12/03 v1.5.1 调整纸张杂点忽略逻辑,避免把细条纹(有效信息)给忽略掉;默认将图像按照灰度图进行识别。
2023/10/12 v1.6 添加新的空白页识别方案。采用JEPG文件大小判断是否为空白页。
2023/10/20 v1.6.1 优化JEPG文件大小判断空白页
* 版本号v1.6.1
* ====================================================
*/
#ifndef IMAGE_APPLY_DISCARD_BLANK_H
#define IMAGE_APPLY_DISCARD_BLANK_H
#include "ImageApply.h"
class GIMGPROC_LIBRARY_API CImageApplyDiscardBlank : public CImageApply
{
public:
enum FileType
{
JPEG_COLOR,
JPEG_GRAY,
PNG_COLOR,
PNG_GRAY,
PNG_BINARAY
};
/// <summary>
/// 空白页识别
/// </summary>
/// <param name="pDib">原图</param>
/// <param name="threshold">轮廓阈值。取值范围[0, 255]</param>
/// <param name="edge">边缘缩进。取值范围[0, +∞]</param>
/// <param name="devTh">笔迹判定阈值。该阈值越低,越容易判定存在笔迹。取值范围[0, +∞]</param>
/// <param name="meanTh">文稿底色阈值。低于该阈值的文稿底色,直接视为非空白页。取值范围[0, 255]</param>
/// <param name="dilate">忽略纸张杂点。≤1时不生效值越大越容易忽略杂点。取值范围[1, +∞]</param>
CImageApplyDiscardBlank(double threshold = 40, int edge = 50, double devTh = 30, double meanTh = 200, int dilate = 11);
virtual ~CImageApplyDiscardBlank(void);
virtual void apply(cv::Mat& pDib, int side);
virtual void apply(std::vector<cv::Mat>& mats, bool isTwoSide);
/// <summary>
/// 空白页识别。根据图像内容进行识别。
/// </summary>
/// <param name="pDib">原图</param>
/// <param name="threshold">轮廓阈值</param>
/// <param name="edge">边缘缩进</param>
/// <param name="devTh">笔迹判定阈值。该阈值越低,越容易判定存在笔迹。</param>
/// <param name="meanTh">文稿底色阈值。低于该阈值的文稿底色,直接视为非空白页。</param>
/// <param name="dilate">忽略纸张杂点。≤1时不生效值越大越容易忽略杂点</param>
/// <returns>true为空白页false为非空白页</returns>
static bool apply(const cv::Mat& pDib, double threshold = 40, int edge = 50, double devTh = 30, double meanTh = 200, int dilate = 3);
/// <summary>
/// 空白页识别。根据jpeg文件大小进行判断。
/// </summary>
/// <param name="fileSize">J文件大小</param>
/// <param name="imageSize">图像大小</param>
/// <param name="flag">0为JPG + 彩色1为JPG + 灰度2为PNG + 彩色, 3为PNG + 灰度, 4为PNG + </param>
/// <returns></returns>
static bool apply(int fileSize, const cv::Size& imageSize, FileType type);
private:
double m_threshold;
int m_edge;
double m_devTh;
double m_meanTh;
int m_dilate;
};
#endif // !IMAGE_APPLY_DISCARD_BLANK_H