From f3a06285ff83eed22c545c9c9f76d75dac363f86 Mon Sep 17 00:00:00 2001 From: yangjiaxuan <171295266@qq.com> Date: Mon, 11 Dec 2023 11:28:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=B7=B3=E8=BF=87=E7=A9=BA?= =?UTF-8?q?=E7=99=BD=E9=A1=B5=E7=AE=97=E6=B3=95v1.10=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E7=AE=97=E6=B3=95=E6=95=88=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ImageProcess/ImageApplyDiscardBlank.cpp | 37 ++++++++++----- .../ImageProcess/ImageApplyDiscardBlank.h | 47 ++++++++++--------- 2 files changed, 48 insertions(+), 36 deletions(-) diff --git a/hgdriver/ImageProcess/ImageApplyDiscardBlank.cpp b/hgdriver/ImageProcess/ImageApplyDiscardBlank.cpp index 9b9f6ad..ac0845e 100644 --- a/hgdriver/ImageProcess/ImageApplyDiscardBlank.cpp +++ b/hgdriver/ImageProcess/ImageApplyDiscardBlank.cpp @@ -33,28 +33,38 @@ void CImageApplyDiscardBlank::apply(std::vector& mats, bool isTwoSide) } } -bool maxMinCompare(const cv::Mat& img, const cv::Mat& mask, double devTh, double meanTh) +bool maxMinCompare(const cv::Mat& img, const cv::Mat& mask, double devTh, double bgc) { double min, max; cv::minMaxLoc(img, &min, &max, 0, 0, mask); - if (cv::mean(img, mask)[0] < meanTh) - return false; - return (max - min) < devTh; + + return abs(max - bgc) < devTh && abs(min - bgc) < devTh; } +static int a = 0; bool CImageApplyDiscardBlank::apply(const cv::Mat& pDib, double threshold, int edge, double devTh, double meanTh, int dilate) { if (pDib.empty()) return true; double resizeScale = 1.0; - while (pDib.cols * resizeScale > 400) + while ((pDib.cols * resizeScale > 500) && (pDib.rows * resizeScale > 500)) resizeScale /= 2; cv::Mat img_resize; cv::resize(pDib, img_resize, cv::Size(), resizeScale, resizeScale, cv::INTER_LINEAR); - cv::blur(img_resize, img_resize, cv::Size(3, 3)); - //cv::imwrite("img_resize.jpg", img_resize); + //cv::dilate(img_resize, img_resize, cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(dilate, dilate))); + cv::blur(img_resize, img_resize, cv::Size(dilate, dilate)); + + cv::Scalar bgc = hg::getBackGroundColor(img_resize, cv::Mat(), 20); + if (pDib.channels() == 3) + if ((bgc[0] + bgc[1] + bgc[2]) < meanTh * 3) + return false; + if (pDib.channels() == 1) + if (bgc[0] < meanTh ) + return false; + + //cv::imwrite(std::to_string(a) + "r.jpg", img_resize); cv::Mat threshold_img; if (img_resize.channels() == 3) { @@ -74,19 +84,20 @@ bool CImageApplyDiscardBlank::apply(const cv::Mat& pDib, double threshold, int e contour.push_back(p); cv::RotatedRect rect = hg::getBoundingRect(contour); - rect.size = cv::Size2f(rect.size.width - edge * resizeScale, rect.size.height - edge * resizeScale); + rect.size = cv::Size2f(rect.size.width - edge * resizeScale * 2, rect.size.height - edge * resizeScale * 2); cv::Point2f box[4]; rect.points(box); + contour.clear(); contours.clear(); - for (size_t i = 0; i < 4; i++) contour.push_back(box[i]); contours.push_back(contour); + cv::Mat mask = cv::Mat::zeros(img_resize.size(), CV_8UC1); hg::fillPolys(mask, contours, cv::Scalar::all(255)); - //cv::imwrite("mask.jpg", mask); - + //cv::imwrite(std::to_string(a) + "m.jpg", mask); + a++; bool b = true; if (img_resize.channels() == 3) { @@ -94,11 +105,11 @@ bool CImageApplyDiscardBlank::apply(const cv::Mat& pDib, double threshold, int e cv::split(img_resize, bgr); for (size_t i = 0; i < 3; i++) { - b &= maxMinCompare(bgr[i], mask, devTh, meanTh); + b &= maxMinCompare(bgr[i], mask, devTh, bgc[i]); if (!b) break; } } else - b &= maxMinCompare(img_resize, mask, devTh, meanTh); + b &= maxMinCompare(img_resize, mask, devTh, bgc[0]); return b; } diff --git a/hgdriver/ImageProcess/ImageApplyDiscardBlank.h b/hgdriver/ImageProcess/ImageApplyDiscardBlank.h index a6149fe..412e93f 100644 --- a/hgdriver/ImageProcess/ImageApplyDiscardBlank.h +++ b/hgdriver/ImageProcess/ImageApplyDiscardBlank.h @@ -5,29 +5,30 @@ * 作者:刘丁维 * 生成时间: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 优化JPEG文件大小判断空白页 - 2023/10/30 v1.7 调整JPEG文件大小判断空白页的算法接口 - 2023/11/04 v1.7.1 增加PNG二值化文件大小判断空白页的选项 - 2023/12/01 v1.8 取消JPEG/PNG文件大小判断空白页方案 - 2023/12/04 v1.9 提高算法效率。 - 2023/12/05 v1.9.1 修改错误代码;修改参数注释。 - * 版本号:v1.9.1 + 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 优化JPEG文件大小判断空白页 + 2023/10/30 v1.7 调整JPEG文件大小判断空白页的算法接口 + 2023/11/04 v1.7.1 增加PNG二值化文件大小判断空白页的选项 + 2023/12/01 v1.8 取消JPEG/PNG文件大小判断空白页方案 + 2023/12/04 v1.9 提高算法效率。 + 2023/12/05 v1.9.1 修改错误代码;修改参数注释。 + 2023/12/08 v1.10 调整空白页判定条件。修复mask精度bug。 + * 版本号:v1.10 * ==================================================== */