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" -/// -/// 检测图像是否是彩色。当前逻辑仅针对红色像素进行判断,即存在红色像素则为彩色,否则为非彩色 -/// -/// 待测图像 -/// true为彩色,false为非彩色 -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; } + +/// +/// 检测图像是否是彩色。当前逻辑仅针对红色像素进行判断,即存在红色像素则为彩色,否则为非彩色 +/// +/// 待测图像 +/// true为彩色,false为非彩色 +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 修改识别策略,能够识别占比1‰的彩色图像。只区分彩色和灰度图。 - * 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 修改识别策略,能够识别占比1‰的彩色图像。只区分彩色和灰度图。 + * 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;