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] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=87=AA=E5=8A=A8=E9=A2=9C?=
=?UTF-8?q?=E8=89=B2=E8=AF=86=E5=88=AB=E7=AE=97=E6=B3=95=EF=BC=8C=E6=8F=90?=
=?UTF-8?q?=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"
-///
-/// 检测图像是否是彩色。当前逻辑仅针对红色像素进行判断,即存在红色像素则为彩色,否则为非彩色
-///
-/// 待测图像
-/// 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;