From 9e30fa0db0a6f55b2cc7aa301039b89f7043e983 Mon Sep 17 00:00:00 2001 From: yangjiaxuan <171295266@qq.com> Date: Tue, 28 Nov 2023 15:47:34 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=A3=81=E5=88=87?= =?UTF-8?q?=E7=BA=A0=E5=81=8F=E7=AE=97=E6=B3=95=E5=88=B0=E6=9C=80=E6=96=B0?= =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hgdriver/ImageProcess/ImageApplyAutoCrop.cpp | 35 ++++++++------ hgdriver/ImageProcess/ImageApplyAutoCrop.h | 51 ++++++++++---------- 2 files changed, 45 insertions(+), 41 deletions(-) diff --git a/hgdriver/ImageProcess/ImageApplyAutoCrop.cpp b/hgdriver/ImageProcess/ImageApplyAutoCrop.cpp index 7c2ff63..0a48e2b 100644 --- a/hgdriver/ImageProcess/ImageApplyAutoCrop.cpp +++ b/hgdriver/ImageProcess/ImageApplyAutoCrop.cpp @@ -4,7 +4,6 @@ #include #include "ImageApplyDispersion.h" -#define COLOR_BACKGROUND_THRE 20 #define FRONT_TOP 70 #define FX_FY 0.5f @@ -18,14 +17,13 @@ CImageApplyAutoCrop::CImageApplyAutoCrop() , m_noise(8) , m_indent(5) , m_normalCrop(false) - , m_isDispersion(true) , m_fx(1.0) , m_fy(1.0) { } CImageApplyAutoCrop::CImageApplyAutoCrop(bool isCrop, bool isDesaskew, bool isFillBlank, const cv::Size& fixedSize, bool isConvex, bool isFillColor, - double threshold, int noise, int indent, bool normalCrop, bool dispersion, double fx, double fy) + double threshold, int noise, int indent, bool normalCrop, double fx, double fy) : m_isCrop(isCrop) , m_isDesaskew(isDesaskew) , m_isFillBlank(isFillBlank) @@ -36,7 +34,6 @@ CImageApplyAutoCrop::CImageApplyAutoCrop(bool isCrop, bool isDesaskew, bool isFi , m_indent(indent) , m_fixedSize(fixedSize) , m_normalCrop(normalCrop) - , m_isDispersion(dispersion) , m_fx(fx) , m_fy(fy) { @@ -50,7 +47,7 @@ void CImageApplyAutoCrop::apply(cv::Mat& pDib, int side) { cv::Mat dst; autoCrop_desaskew_fillBlank(pDib, dst, m_isCrop, m_isDesaskew, m_isFillBlank, m_fixedSize.width, m_fixedSize.height, - m_isConvexHull, m_isFillColor, m_threshold, m_noise, m_indent, m_normalCrop, m_isDispersion, m_fx, m_fy); + m_isConvexHull, m_isFillColor, m_threshold, m_noise, m_indent, m_normalCrop, m_fx, m_fy); pDib = dst; } @@ -99,14 +96,14 @@ void CImageApplyAutoCrop::myWarpAffine(cv::InputArray _src, cv::OutputArray _dst M, interpolation, borderType, borderValue.val); } -cv::Scalar CImageApplyAutoCrop::getBackGroudColor(const cv::Mat& image, int threshold) +cv::Scalar CImageApplyAutoCrop::getBackGroudColor(const cv::Mat& image) { if (image.channels() == 3) { uchar table[768] = { 0 }; int hist_bgr[3][256] = { 0 }; int width = image.cols, height = image.rows, bytesPerLine = image.step; - memset(table + threshold * 3, 255, 768 - threshold * 3); + memset(table, 255, 768); unsigned char* ptr_data = image.data; unsigned char b = 0; @@ -136,7 +133,7 @@ cv::Scalar CImageApplyAutoCrop::getBackGroudColor(const cv::Mat& image, int thre uchar table[256] = { 0 }; int hist_bgr[256] = { 0 }; int width = image.cols, height = image.rows, bytesPerLine = image.step; - memset(table + threshold, 255, 256 - threshold); + memset(table, 255, 256); unsigned char* ptr_data = image.data; unsigned char b = 0; for (uint i = 0; i < height; i++, ptr_data += bytesPerLine) @@ -153,7 +150,7 @@ cv::Scalar CImageApplyAutoCrop::getBackGroudColor(const cv::Mat& image, int thre } void CImageApplyAutoCrop::autoCrop_desaskew_fillBlank(cv::Mat& src, cv::Mat& dst, bool isAutoCrop, bool isDesaskew, bool isFillBlank, int dWidth, int dHeight, - bool isConvex, bool isColorBlank, double threshold, int noise, int indent, bool isNormalCrop, bool dispersion, double fx, double fy) + bool isConvex, bool isColorBlank, double threshold, int noise, int indent, bool isNormalCrop, double fx, double fy) { if (src.empty()) return; @@ -186,7 +183,7 @@ void CImageApplyAutoCrop::autoCrop_desaskew_fillBlank(cv::Mat& src, cv::Mat& dst hg::threshold_Mat(resizeMat, thre, threshold); if (noise > 0) - cv::morphologyEx(thre, thre, cv::MORPH_OPEN, getStructuringElement(cv::MORPH_RECT, cv::Size(noise * FX_FY, 1)), + cv::morphologyEx(thre, thre, cv::MORPH_OPEN, getStructuringElement(cv::MORPH_RECT, cv::Size(cv::max(static_cast(noise * FX_FY), 1), 1)), cv::Point(-1, -1), 1, cv::BORDER_CONSTANT, cv::Scalar::all(0)); std::vector hierarchy; @@ -213,18 +210,24 @@ void CImageApplyAutoCrop::autoCrop_desaskew_fillBlank(cv::Mat& src, cv::Mat& dst } cv::RotatedRect rect = hg::getBoundingRect(maxContour); - - if (dispersion) + if (rect.size.width < 1 || rect.size.height < 1) { - CImageApplyDispersion m_dispersion_apply; - cv::Mat mat_dispersion = src(cv::boundingRect(maxContour)); - m_dispersion_apply.apply(mat_dispersion, 0); + dst = src; + return; } cv::Scalar blankColor; if (isFillBlank) if (isColorBlank) - blankColor = getBackGroudColor(resizeMat, COLOR_BACKGROUND_THRE); + { + cv::Rect boudingRect = cv::boundingRect(maxContour); + boudingRect.x *= FX_FY; + boudingRect.y *= FX_FY; + boudingRect.width *= FX_FY; + boudingRect.height *= FX_FY; + + blankColor = getBackGroudColor(resizeMat(boudingRect)); + } else blankColor = cv::Scalar::all(255); else diff --git a/hgdriver/ImageProcess/ImageApplyAutoCrop.h b/hgdriver/ImageProcess/ImageApplyAutoCrop.h index 1f4c9d7..8c749cd 100644 --- a/hgdriver/ImageProcess/ImageApplyAutoCrop.h +++ b/hgdriver/ImageProcess/ImageApplyAutoCrop.h @@ -2,8 +2,8 @@ * ==================================================== * 功能:自动裁剪、纠偏、除黑底 - * 作者:刘丁绿 - * 生成时间_020/4/21 + * 作者:刘丁维 + * 生成时间:2020/4/21 * 最近修改时间:2020/4/21 v1.0 2020/7/22 v1.1 增加获取图像有效区域轮廓的接口maxContour(用于配合一体机的“跳过空白页”算法,PC端暂时无需使用_ 2020/10/16 v1.2 修复自动裁剪尺寸精度丢失的BUG;提高除黑底缩进精度 @@ -29,7 +29,12 @@ 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 + 2023/03/17 v1.5.3 修复背景除噪时,形态学处理kSize可能为0的BUG。 + 2023/04/19 v1.5.4 取消集成色散功能。 + 2023/05/15 v1.5.5 优化文稿背景色识别算法。 + 2023/05/23 v1.5.6 修复纯黑图找不到外界轮廓会导致崩溃的BUG。 + 2023/11/02 v1.6 优化抗噪能力。采用自适应背景色二值化。 + * 版本号:v1.5.6 * ==================================================== */ @@ -39,29 +44,28 @@ #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 - */ + /// + /// 构造函数 + /// + /// 自动幅面裁剪使能,true自动裁剪,false为固定裁切 + /// 自动纠偏使能,true自动纠偏,false为不纠偏 + /// 黑底填充使能,true为填充,false为不填充 + /// 固定幅面尺寸,当isCrop为false时生效,结果尺寸按fixedSize大小输出,单位像素 + /// 黑底填充时的填充方式,true为凸多边形填充,false为凹多边形填充,默认true + /// 黑底填充时采用自适应色彩填充,false为白色填充,true为自适应文稿底色填充,默认false + /// 二值化阈值,取值范囿[-1, 255],默认40。当threshold<0时,采用根据背景自适应二值化。 + /// 除噪像素,能够消除noise宽度的背景竖条纹干扰,默认8。 + /// 轮廓缩进,裁剪、纠偏或者黑底填充时,对探索到的纸张轮廓进行缩进indent像素,默认8 + /// 为true时,m_isCrop m_isDesaskew m_isFillBlank失效,固定裁切采用最传统的裁切方式,默认false + /// 横向缩放比例。默认1.0 + /// 纵向缩放比例。默认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); + bool isFillColor = false, double threshold = 40, int noise = 8, int indent = 5, bool normalCrop = false, double fx = 1.0, double fy = 1.0); virtual ~CImageApplyAutoCrop(); @@ -105,23 +109,20 @@ public: 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, + bool isConvex = true, bool isColorBlank = false, double threshold = 40, int noise = 8, int indent = 5, bool isNormalCrop = false, 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); + static cv::Scalar getBackGroudColor(const cv::Mat& image); 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; From 7f4bb50a57a5ca18ed767ef5a097feaa884c2b4b Mon Sep 17 00:00:00 2001 From: yangjiaxuan <171295266@qq.com> Date: Tue, 28 Nov 2023 16:12:45 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hgdriver/hgdev/hg_scanner_300.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hgdriver/hgdev/hg_scanner_300.cpp b/hgdriver/hgdev/hg_scanner_300.cpp index eeca6b9..43831e7 100644 --- a/hgdriver/hgdev/hg_scanner_300.cpp +++ b/hgdriver/hgdev/hg_scanner_300.cpp @@ -737,7 +737,10 @@ int hg_scanner_300::set_kernelsnap_ver() if (atoi(fw.substr(4, 6).c_str()) >= 221106 && atoi(fw.substr(4, 6).c_str()) < 230210) firmware_sup_dpi_300 = true; else if (atoi(fw.substr(4, 6).c_str()) >= 230210) + { + firmware_sup_dpi_300 = true; firmware_sup_dpi_600 = true; + } else { firmware_sup_dpi_300 = false; From a423b0c8ba2b97993c2eff3e471c01735ca2db5f Mon Sep 17 00:00:00 2001 From: yangjiaxuan <171295266@qq.com> Date: Tue, 28 Nov 2023 17:10:07 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=99=A4=E7=A9=BF?= =?UTF-8?q?=E5=AD=94=E7=AE=97=E6=B3=95=EF=BC=8C=E8=A7=A3=E5=86=B3=E7=9C=9F?= =?UTF-8?q?=E5=AE=9E600dpi=E9=99=A4=E7=A9=BF=E5=AD=94=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hgdriver/ImageProcess/ImageApplyOutHole.cpp | 2 +- hgdriver/ImageProcess/ImageApplyOutHole.h | 45 +++++++++++---------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/hgdriver/ImageProcess/ImageApplyOutHole.cpp b/hgdriver/ImageProcess/ImageApplyOutHole.cpp index 0c2ada4..41e82e7 100644 --- a/hgdriver/ImageProcess/ImageApplyOutHole.cpp +++ b/hgdriver/ImageProcess/ImageApplyOutHole.cpp @@ -212,7 +212,7 @@ void CImageApplyOutHole::apply(std::vector& mats, bool isTwoSide) for (size_t i = 0; i < hole_contours.size(); i++) { std::vector> contourss_temp; - dilateContour(hole_contours[i], 5); + dilateContour(hole_contours[i], m_borderSize / 4); contourss_temp.push_back(hole_contours[i]); cv::Mat front_temp = mats[0](roi_front); hg::fillPolys(front_temp, contourss_temp, color); diff --git a/hgdriver/ImageProcess/ImageApplyOutHole.h b/hgdriver/ImageProcess/ImageApplyOutHole.h index 69317e9..b361720 100644 --- a/hgdriver/ImageProcess/ImageApplyOutHole.h +++ b/hgdriver/ImageProcess/ImageApplyOutHole.h @@ -6,28 +6,29 @@ * ʱ䣺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 - * 2023/05/16 v1.9.3 ޸ȡֽ߼BUG - * 2023/11/18 v1.10 滻̬ѧͿ׶Ϊ˵ - * 汾ţv1.10 + * 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 + * 2023/05/16 v1.9.3 ޸ȡֽ߼BUG + * 2023/11/18 v1.10 滻̬ѧͿ׶Ϊ˵ + * 2023/11/28 v1.10.1 ̬ѧkSizeborderSize + * 汾ţv1.10.1 * ==================================================== */ From 9590e61da2f7a0fce333a79d239cb6c86b7de2b5 Mon Sep 17 00:00:00 2001 From: yangjiaxuan <171295266@qq.com> Date: Tue, 28 Nov 2023 18:04:08 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=A2=9C=E8=89=B2=E8=AF=86=E5=88=AB=E7=AE=97=E6=B3=95=EF=BC=8C?= =?UTF-8?q?=E6=8F=90=E9=AB=98=E8=AF=86=E5=88=AB=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ImageApplyColorRecognition.cpp | 49 ++++++++++--------- .../ImageProcess/ImageApplyColorRecognition.h | 18 ++++--- 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/hgdriver/ImageProcess/ImageApplyColorRecognition.cpp b/hgdriver/ImageProcess/ImageApplyColorRecognition.cpp index c25a460..554134c 100644 --- a/hgdriver/ImageProcess/ImageApplyColorRecognition.cpp +++ b/hgdriver/ImageProcess/ImageApplyColorRecognition.cpp @@ -1,28 +1,5 @@ #include "ImageApplyColorRecognition.h" -/// -/// ͼǷDzɫǰ߼ԺɫؽжϣںɫΪɫΪDzɫ -/// -/// ͼ -/// trueΪɫfalseΪDzɫ -bool isColor(const cv::Mat& image, double threshold = 60) -{ - if (image.channels() != 3) return false; - - cv::Mat pDib_resize; - cv::resize(image, pDib_resize, cv::Size(200, 200), 0, 0, cv::INTER_AREA); - - cv::Mat hsv; - cv::cvtColor(pDib_resize, hsv, cv::COLOR_BGR2HSV_FULL); - std::vector hsv_channels; - cv::split(hsv, hsv_channels); - - double minVal, maxVal; - cv::minMaxLoc(hsv_channels[1], &minVal, &maxVal); - - return maxVal > threshold; -} - bool isGray(const cv::Mat& image) { //if (image.channels() == 3) return true; @@ -62,6 +39,7 @@ CImageApplyColorRecognition::~CImageApplyColorRecognition(void) { } +#define HSV_S_THRE 30 void CImageApplyColorRecognition::apply(cv::Mat& pDib, int side) { if (pDib.channels() != 3) @@ -69,7 +47,7 @@ void CImageApplyColorRecognition::apply(cv::Mat& pDib, int side) m_result = Gray; return; } - m_result = isColor(pDib) ? Color : Gray; + m_result = isColor(pDib, HSV_S_THRE) ? Color : Gray; if (m_result == Gray && pDib.channels() == 3) cv::cvtColor(pDib, pDib, cv::COLOR_BGR2GRAY); @@ -135,3 +113,26 @@ std::vector CImageApplyColorRecognition: { return m_results; } + +/// +/// ͼǷDzɫǰ߼ԺɫؽжϣںɫΪɫΪDzɫ +/// +/// ͼ +/// trueΪɫfalseΪDzɫ +bool CImageApplyColorRecognition::isColor(const cv::Mat& image, double threshold) +{ + if (image.channels() != 3) return false; + + cv::Mat pDib_resize; + cv::resize(image, pDib_resize, cv::Size(200, 200), 0, 0, cv::INTER_AREA); + //cv::imwrite("pDib_resize.bmp", pDib_resize); + cv::Mat hsv; + cv::cvtColor(pDib_resize, hsv, cv::COLOR_BGR2HSV_FULL); + std::vector hsv_channels; + cv::split(hsv, hsv_channels); + + double minVal, maxVal; + cv::minMaxLoc(hsv_channels[1], &minVal, &maxVal); + + return maxVal > threshold; +} diff --git a/hgdriver/ImageProcess/ImageApplyColorRecognition.h b/hgdriver/ImageProcess/ImageApplyColorRecognition.h index eae6b50..62873fe 100644 --- a/hgdriver/ImageProcess/ImageApplyColorRecognition.h +++ b/hgdriver/ImageProcess/ImageApplyColorRecognition.h @@ -4,13 +4,14 @@ * ܣɫʶ𣬽ʶᡰҶȡ24λͼתΪ256ɫ8λͼ ʶΪڰסͼתΪֵ8λͼ * ߣά * ʱ䣺2020/7/17 - * ޸ʱ䣺v1.0 2020/7/17 - * v1.1 2020/12/15 ԣжϺɫأںɫΪɫΪҶȣɾֱתͼ - * v1.2 2020/12/16 ɫģʽֻ֣ӽʽӿ - * v1.3 2021/04/19 ޸ʶԣܹʶռ1IJɫͼֲֻɫͻҶͼ - * v1.4 2021/06/18 ɫ䣬ԭ[90, 200]Ϊ[50, 200] - * v1.5 2023/11/22 ɫжԡ - * 汾ţv1.5 + * ޸ʱ䣺v1.0 2020/7/17 + * v1.1 2020/12/15 ԣжϺɫأںɫΪɫΪҶȣɾֱתͼ + * v1.2 2020/12/16 ɫģʽֻ֣ӽʽӿ + * v1.3 2021/04/19 ޸ʶԣܹʶռ1IJɫͼֲֻɫͻҶͼ + * v1.4 2021/06/18 ɫ䣬ԭ[90, 200]Ϊ[50, 200] + * v1.5 2023/11/22 ɫжԡ + * v1.5.1 2023//11/28 Ͷжֵ + * 汾ţv1.5.1 * ==================================================== */ @@ -60,6 +61,9 @@ public: /// ɫ std::vector getResults(); +private: + bool isColor(const cv::Mat& image, double threshold = 30); + private: ColorType m_result; std::vector m_results;