您好,
会员登录 快速注册
退出 ( 条未读消息)
关于本站 意见反馈 首页

公告:小宅博客网可以开发票了,需要发票的,去群里找群主哈!!
全部文章分类
  • 人工智能 >

  • 编程语言 >

  • WPF系列 >

  • ASP.NET系列 >

  • Linux >

  • 数据库 >

  • 嵌入式 >

  • WEB技术 >

  • PLC系列 >

  • 微服务与框架 >

  • 小宅DIY >

  • 学习资料 >

OpenCv基础 ANN车牌识别 yolov5车牌识别 指针式仪表识别 ROS系列 YOLO Halcon Detectron2 昇腾AI ChatGPT在线体验 英伟达JETSON ChatGLM ChatTTS FunASR 地平线 ByteTrack 魔搭社区 LangChain
C C# C++ Python Java Go
WPF
ASP.NET小功能 GPS定位系统-MVC GPS定位系统-VUE ASP.NET WebRTC
Linux Linux内核 Shell MakeFile
MySql SqlServer Oracle
STM8 STM32 51单片机
VUE入门 HTML JavaScript CSS layui镜像网站 ElementUi中文官网 element-plus 图标
三菱 欧姆龙 西门子 施耐德 松下 台达
IOTSharp IOTGateway ABP FRAMEWORK Docker
亚克力音响 编程仙途:智驭万法
面试题与技巧 Python入门技能树 微软C#教程
首页 编程之美 工具下载 全国就业 流量地图 文心一言
OpenCv基础
内容介绍与资料分享 C# OpenCv环境搭建 C++ OpenCv环境搭建 Python OpenCv环境搭建 Java OpenCv环境搭建 OpenCv组件结构解析 OpenCv命名规范 OpenCv基本专业术语与方法 OpenCV 常用函数与构造体详细说明 创建画布 打开一张图片 利用imwrite生成透明png图像 图像打开、混合显示和输出 图像腐蚀 blur图像模糊(均值滤波) sobel边缘检测 canny边缘检测 Scharr滤波器 程序性能检测及优化 视频播放 摄像头录像与播放 双摄像头操作与图像相似度检测 颜色空间转换与物体追踪 彩色目标追踪 光流法运动目标检测 OpenCV中的稠密光流 背景减除 点追踪 人脸识别 支持向量机之SVM引导 支持向量机之处理线性不可分数据 ROI矩形截取 鼠标绘制矩形 用OpenCV进行基本绘图 绘图函数(python中文显示) 把鼠标当画笔 用滑动条做调色板 图像的基础操作 图像上的算术运算 多通道图像混合 图像的亮度、对比度调整 XML和YAML文件的写入 XML和YAML文件的读取 卷积操作 三种线性滤波 两种非线性滤波 7种图像处理形态学(1) 7种图像处理形态学(2) 漫水填充 图像缩放与图像金字塔 二值化基本阈值操作 图像阈值 Laplacian图像变换(拉普拉斯算子) 霍夫变换HoughLines边缘检测与线性矢量 霍夫变换HoughLinesP边缘检测与线性矢量 霍夫变换HoughCircles边缘检测与线性矢量 LSD快速直线检测 几何变换 remap重映射 remap实现多种重映射 仿射变换综合示例 直方图均衡化 CLAHE有限对比适应性直方图均衡化 draw最大的轮廓 轮廓的性质 点到多边形的最短距离 形状匹配 椭圆拟合与直线拟合 基础轮廓查找 查找并绘制轮廓综合示例 凸缺陷/凸包检测 凸包检测 创建包围轮廓的矩形边界 创建包围轮廓的圆形边 创建包围轮廓的矩形和圆形边界框 查找和绘制图片轮廓矩 分水岭算法 图像修补 H-S二维直方图的绘制/2D直方图 一维直方图的绘制 RGB三色直方图的绘制 直方图对比 使用掩膜绘制直方图 直方图反向投影 模板匹配 多对象模板匹配 cornerHarris角点检测 cornerHarris角点检测综合示例 Shi-Tomasi角点检测 亚像素级角点检测 角点检测的FAST算法(FAST特征检测器) 颜色识别 warpPerspective透视变换 SURF/SIFT特征点检测 SURF/SIFT特征描述 使用FLANN进行特征点匹配 FLANN结合SURF/SIFT进行关键点的描述和匹配 寻找已知物体(一) 寻找已知物体(二) 目标查找与跟踪 - Meanshift与CamShift BRIEF描述符 ORB ORB算法描述与匹配 LUT 图像灰度调整 离散傅里叶变换 双目摄像头与图像拼接 环境亮度检测 stitching 全景拼接 Maze-Solver迷宫解密 使用Haar分类器之面部检测 使用Haar分类器之行人检测 OpenCv Haar/LBP/HOG分类器-人脸识别 斑点检测 使用GrabCut算法进行交互式前景提取 对极几何 摄像机标定 姿势估计 立体图像中的深度地图 OpenCv中的KNN KNN手写数字识别 ​SVM手写数字识别(使用SVM进行手写数据OCR) 英文字母的OCR 预测手写数字(预测不准) K值聚类(一) K值聚类(二) 计算摄影学-图像去噪 高动态范围成像(HDRI或HDR) MSER区域检测 二维码、条形码识别 删除图像中的水印 OpenCv深度学习dnn Kinect-深度相机 OpenCv常用数学算法 360度旋转直线绘制 向量延长线上的像素扫描 Tools工具包-窗体分配
角点检测的FAST算法(FAST特征检测器)
warpPerspective透视变换
激萌の小宅 小宅博客网 OpenCv基础

文章作者:激萌の小宅

促销:¥0

价格:¥0

配送方式: 购买后立即生效(如购买异常,请联系站长)
付款之后一定要等待自动跳转结束,否则购买可能会失败
  • 0 天

    有效期

  • 0

    总销量

  • 0

    累计评价

颜色识别

视频讲解如下:


在本章节中给大家演示如何进行颜色识别,主要函数:inRange。当前代码并非毛星云的代码,而是博主自行整理的,毛星云的教程中好像没有颜色识别这一讲。

当前系列所有demo下载地址:

https://github.com/GaoRenBao/OpenCv4-Demo

不同编程语言对应的OpenCv版本以及开发环境信息如下: 

语言

OpenCv版本

IDE

C#

OpenCvSharp4.4.8.0.20230708

Visual Studio 2022

C++

OpenCv-4.5.5-vc14_vc15

Visual Studio 2022

Python

OpenCv-Python (4.6.0.66)

PyCharm Community Edition 2022.1.3


HSV颜色空间介绍

        参考网址:https://blog.csdn.net/Solomon1558/article/details/43772147

        系统的颜色识别采用的是SHV(HSI)颜色空间。

        HSI(Hue,Saturation andIntensity)颜色空间是从人的视觉系统出发,用色调(Hue)、色饱和度(Saturation或Chroma)和亮度(Intensity或Brightness)来描述颜色。HSI颜色空间可以用一个圆锥空间模型来描述,如下图。

QQ截图20220608211912.jpg

用这种描述HIS颜色空间的圆锥模型相当复杂,但确能把色调、亮度和色饱和度的变化情形表现得很清楚。其中:

(A)HSI圆锥空间模型

(B)线条示意图:圆锥上亮度、色度和饱和度的关系。

(C)纵轴表示亮度:亮度值是沿着圆锥的轴线度量的,沿着圆锥轴线上的点表示完全不饱和的颜色,按照不同的灰度等级,最亮点为纯白色、最暗点为纯黑色。

(D)圆锥纵切面:描述了同一色调的不同亮度和饱和度关系。

(E)圆锥横切面:色调H为绕着圆锥截面度量的色环,圆周上的颜色为完全饱和的纯色,色饱和度为穿过中心的半径横轴。


HSV颜色空间设置方法

        参考网址:https://blog.csdn.net/taily_duan/article/details/51506776


在描述设置方法之前,我们先假定我们需要设置的系统识别颜色为黄色,而我们需要设置的颜色HSV的值,其中:

H值的范围:0~180

S值的范围:0~255

V值的范围:0~255

网上给出了一张HSV范围的参考表,当然了,该表只能作为参考,因为表中部分红色被归为紫色,实际取值范围还得根据实际情况进行调整,参考表如下图:

图片1.jpg

实际的黄色HSV值取值范围确定方法如下:

步骤1:

        首先在网上找一张黄色图片,图片如下:

图片2.jpg

步骤2:

        将图片用Photoshop打开,因为使用Photoshop我们能够很直接的获取到图片中颜色的HSV值,图片打开如下

图片3.jpg

        通过设置颜色属性,我们可以看到有一个“HSB滑块”的选项,然后通过吸管工具不断的提取图片中黄色区域的颜色,我们可以发现颜色属性中HSB的值是在变化的,并且H的变化范围为0~360,S的变化范围为0~100,B的变化范围为0~100,。其中HSB和HSV的对应关系如下:

Photoshop

OpenCV

比例关系

HH

2:1

SS

百分比关系

BV

百分比关系


        通过吸管工具的提取效果显示,在Photoshop中色调H的大致范围为41~58,饱和度S的范围为83%~100%,亮度B的范围为60%~100%,但是为了能够让系统更能准确的识别出黄色,我们还得借助Photoshop的另一个工具拾色器。如下:

图片4.jpg

我们都知道,黄色的RGB颜色为:(255,255,0),通过拾色器设置RGB颜色,我们可以发现,黄色的色调H的最大值为60,饱和度S和亮度B的最大值为100%,也就是说在Photoshop中黄色的HSB值范围如下:

色调H范围:41~60

饱和度S范围:83%~100%

亮度B范围:60%~100%

 

我们知道,Photoshop中的HSB和OpenCV中的HSV是存在比例关系的,所以在OpenCV中HSV的取值范围为:

色调H最小值:41/2≈20

色调H最大值:60/2 = 30

饱和度S最小值:255*83%≈212

饱和度S最大值:255*100%=255

亮度V最小值:255*60%=153

亮度V最大值:255*100%=255


步骤3

        通过前一步的HSV范围提取,到了这一步我们就可以直接使用函数inRange()进行图像颜色空间的识别了,实现代码如下:

int iLowH = 20;
int iHighH = 30;
int iLowS = 0.83 * 255;
int iHighS = 255;
int iLowV = 0.60 * 255;
int iHighV = 255;
cvtColor(inImg, imgHSV, COLOR_BGR2HSV);//转为HSV
Mat imgThresholded;
inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);

将原始图像转换成HSV图像后的效果如下:

图片5.jpg

经过颜色识别后的图像如下:

图片6.jpg

通过以上识别,我们可以发现,系统已经能够将图像中的黄色区域给扣取出来,为了能够更好的说明,系统颜色识别的准确性,我准备了这样一张图片,如下:

图片7.jpg

系统识别结果如下:

将原始图像转换成HSV图像后的效果如下:

图片8.jpg

经过颜色识别后的图像如下:

图片9.jpg

到了这一步,系统的颜色识别功能就完成了。


项目工程演示

        前面讲解了如何提取HSV颜色空间区间,下面我们来演示一下我们的C#、C++、Python三个版本的颜色识别demo。

        首先了,我们准备一张测试用的图片:

1.jpg


运行效果如下(C#):

1.gif


C#版本代码如下:

using OpenCvSharp;

namespace demo
{
    internal class Program
    {
        /// <summary>
        /// 颜色识别(除红色外的其他单色)
        /// </summary>
        /// <param name="srcImage"></param>
        /// <returns></returns>
        static Mat ColorFindContours(Mat srcImage,
            int iLowH, int iHighH,
            int iLowS, int iHighS,
            int iLowV, int iHighV)
        {
            Mat bufImg = new Mat();
            Mat imgHSV = new Mat();
            //转为HSV
            Cv2.CvtColor(srcImage, imgHSV, ColorConversionCodes.BGR2HSV);
            Cv2.InRange(imgHSV, new Scalar(iLowH, iLowS, iLowV), new Scalar(iHighH, iHighS, iHighV), bufImg);
            return bufImg;
        }

        /// <summary>
        /// 颜色识别(红色)
        /// </summary>
        /// <param name="srcImage"></param>
        /// <returns></returns>
        static Mat ColorFindContours2(Mat srcImage)
        {
            Mat des1 = ColorFindContours(srcImage,
              350 / 2, 360 / 2,         // 色调最小值~最大值
              (int)(255 * 0.70), 255,   // 饱和度最小值~最大值
              (int)(255 * 0.60), 255);  // 亮度最小值~最大值

            Mat des2 = ColorFindContours(srcImage,
               0, 16 / 2,               // 色调最小值~最大值
              (int)(255 * 0.70), 255,   // 饱和度最小值~最大值
              (int)(255 * 0.60), 255);  // 亮度最小值~最大值

            return des1 + des2;
        }

        /// <summary>
        /// 黄色识别
        /// </summary>
        static void demo1()
        {
            Mat g_srcImage = Cv2.ImRead("../../../images/color.jpg");
            Cv2.ImShow("原始图1", g_srcImage);

            Mat des = ColorFindContours(g_srcImage,
                45 / 2, 60 / 2,           // 色调最小值~最大值
                (int)(255 * 0.60), 255,   // 饱和度最小值~最大值
                (int)(255 * 0.90), 255);  // 亮度最小值~最大值

            Cv2.ImShow("demo1", des);
        }

        /// <summary>
        /// 红色识别
        /// </summary>
        static void demo2()
        {
            Mat g_srcImage = Cv2.ImRead("../../../images/color.jpg");
            Cv2.ImShow("原始图2", g_srcImage);
            Mat des = ColorFindContours2(g_srcImage);
            Cv2.ImShow("demo2", des);
        }

        static void Main(string[] args)
        {
            demo1();
            demo2();
            Cv2.WaitKey();
        }
    }
}


C++版本代码如下:

#include <opencv2/opencv.hpp>  
#include <opencv2/imgproc/imgproc.hpp>  

using namespace cv;

// 颜色识别(除红色外的其他单色)
Mat ColorFindContours(Mat srcImage,
    int iLowH, int iHighH,
    int iLowS, int iHighS,
    int iLowV, int iHighV)
{
    Mat bufImg;
    Mat imgHSV;
    //转为HSV
    cvtColor(srcImage, imgHSV, COLOR_BGR2HSV);
    inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), bufImg);
    return bufImg;
}

// 颜色识别(红色)
Mat ColorFindContours2(Mat srcImage)
{
    Mat des1 = ColorFindContours(srcImage,
        350 / 2, 360 / 2,         // 色调最小值~最大值
        (int)(255 * 0.70), 255,   // 饱和度最小值~最大值
        (int)(255 * 0.60), 255);  // 亮度最小值~最大值

    Mat des2 = ColorFindContours(srcImage,
        0, 16 / 2,                // 色调最小值~最大值
        (int)(255 * 0.70), 255,   // 饱和度最小值~最大值
        (int)(255 * 0.60), 255);  // 亮度最小值~最大值

    return des1 + des2;
}

int main()
{
    //载入色卡
    Mat srcImage = imread("../images/color.jpg");
    imshow("原始图", srcImage);

    // 黄色识别
    Mat des = ColorFindContours(srcImage,
        45 / 2, 60 / 2,          // 色调最小值~最大值
        (int)(255 * 0.60), 255,  // 饱和度最小值~最大值
        (int)(255 * 0.90), 255); // 亮度最小值~最大值
    imshow("des1", des);

    // 红色识别
    des = ColorFindContours2(srcImage);
    imshow("des2", des);

    waitKey(0);
    return 0;
}


Python版本代码如下:

import cv2
import numpy as np


def ColorFindContours(srcImage, iLowH, iHighH, iLowS, iHighS, iLowV, iHighV):
    # 转为HSV
    imgHSV = cv2.cvtColor(srcImage, cv2.COLOR_BGR2HSV)
    bufImg = cv2.inRange(imgHSV, np.array((iLowH, iLowS, iLowV)), np.array((iHighH, iHighS, iHighV)))
    return bufImg


def ColorFindContours2(srcImage):
    des1 = ColorFindContours(srcImage,
                             350 / 2, 360 / 2,  # 色调最小值~最大值
                             int(255 * 0.70), 255,  # 饱和度最小值~最大值
                             int(255 * 0.60), 255)  # 亮度最小值~最大值

    des2 = ColorFindContours(srcImage,
                             0, int(16 / 2),  # 色调最小值~最大值
                             int(255 * 0.70), 255,  # 饱和度最小值~最大值
                             int(255 * 0.60), 255)  # 亮度最小值~最大值

    return des1 + des2


# 载入色卡
srcImage = cv2.imread("../images/color.jpg")
# 显示原图
cv2.imshow("srcImage", srcImage)

des = ColorFindContours(srcImage,
                        45 / 2, 60 / 2,  # 色调最小值~最大值
                        int(255 * 0.60), 255,  # 饱和度最小值~最大值
                        int(255 * 0.90), 255)  # 亮度最小值~最大值
cv2.imshow("des1", des)

des = ColorFindContours2(srcImage)
cv2.imshow("des2", des)

cv2.waitKey(0)
cv2.destroyAllWindows()
角点检测的FAST算法(FAST特征检测器)
warpPerspective透视变换

友情链接: CSDN激萌の小宅 95知识库 自考题库 罗分明个人网络博客 精益编程leanboot

小宅博客  www.bilibili996.com All Rights Reserved. 备案号: 闽ICP备2024034575号

网站经营许可证  福建省福州市 Copyright©2021-2025 版权所有

小宅博客
首页 智能家居 地图定位
公告:小宅博客网可以开发票了,需要发票的,去群里找群主哈!!

文章作者:激萌の小宅

促销:¥0

价格:¥0

配送方式: 购买后立即生效(如购买异常,请联系站长)
付款之后一定要等待自动跳转结束,否则购买可能会失败
  • 0 天

    有效期

  • 0

    总销量

  • 0

    累计评价

颜色识别

视频讲解如下:


在本章节中给大家演示如何进行颜色识别,主要函数:inRange。当前代码并非毛星云的代码,而是博主自行整理的,毛星云的教程中好像没有颜色识别这一讲。

当前系列所有demo下载地址:

https://github.com/GaoRenBao/OpenCv4-Demo

不同编程语言对应的OpenCv版本以及开发环境信息如下: 

语言

OpenCv版本

IDE

C#

OpenCvSharp4.4.8.0.20230708

Visual Studio 2022

C++

OpenCv-4.5.5-vc14_vc15

Visual Studio 2022

Python

OpenCv-Python (4.6.0.66)

PyCharm Community Edition 2022.1.3


HSV颜色空间介绍

        参考网址:https://blog.csdn.net/Solomon1558/article/details/43772147

        系统的颜色识别采用的是SHV(HSI)颜色空间。

        HSI(Hue,Saturation andIntensity)颜色空间是从人的视觉系统出发,用色调(Hue)、色饱和度(Saturation或Chroma)和亮度(Intensity或Brightness)来描述颜色。HSI颜色空间可以用一个圆锥空间模型来描述,如下图。

QQ截图20220608211912.jpg

用这种描述HIS颜色空间的圆锥模型相当复杂,但确能把色调、亮度和色饱和度的变化情形表现得很清楚。其中:

(A)HSI圆锥空间模型

(B)线条示意图:圆锥上亮度、色度和饱和度的关系。

(C)纵轴表示亮度:亮度值是沿着圆锥的轴线度量的,沿着圆锥轴线上的点表示完全不饱和的颜色,按照不同的灰度等级,最亮点为纯白色、最暗点为纯黑色。

(D)圆锥纵切面:描述了同一色调的不同亮度和饱和度关系。

(E)圆锥横切面:色调H为绕着圆锥截面度量的色环,圆周上的颜色为完全饱和的纯色,色饱和度为穿过中心的半径横轴。


HSV颜色空间设置方法

        参考网址:https://blog.csdn.net/taily_duan/article/details/51506776


在描述设置方法之前,我们先假定我们需要设置的系统识别颜色为黄色,而我们需要设置的颜色HSV的值,其中:

H值的范围:0~180

S值的范围:0~255

V值的范围:0~255

网上给出了一张HSV范围的参考表,当然了,该表只能作为参考,因为表中部分红色被归为紫色,实际取值范围还得根据实际情况进行调整,参考表如下图:

图片1.jpg

实际的黄色HSV值取值范围确定方法如下:

步骤1:

        首先在网上找一张黄色图片,图片如下:

图片2.jpg

步骤2:

        将图片用Photoshop打开,因为使用Photoshop我们能够很直接的获取到图片中颜色的HSV值,图片打开如下

图片3.jpg

        通过设置颜色属性,我们可以看到有一个“HSB滑块”的选项,然后通过吸管工具不断的提取图片中黄色区域的颜色,我们可以发现颜色属性中HSB的值是在变化的,并且H的变化范围为0~360,S的变化范围为0~100,B的变化范围为0~100,。其中HSB和HSV的对应关系如下:

Photoshop

OpenCV

比例关系

HH

2:1

SS

百分比关系

BV

百分比关系


        通过吸管工具的提取效果显示,在Photoshop中色调H的大致范围为41~58,饱和度S的范围为83%~100%,亮度B的范围为60%~100%,但是为了能够让系统更能准确的识别出黄色,我们还得借助Photoshop的另一个工具拾色器。如下:

图片4.jpg

我们都知道,黄色的RGB颜色为:(255,255,0),通过拾色器设置RGB颜色,我们可以发现,黄色的色调H的最大值为60,饱和度S和亮度B的最大值为100%,也就是说在Photoshop中黄色的HSB值范围如下:

色调H范围:41~60

饱和度S范围:83%~100%

亮度B范围:60%~100%

 

我们知道,Photoshop中的HSB和OpenCV中的HSV是存在比例关系的,所以在OpenCV中HSV的取值范围为:

色调H最小值:41/2≈20

色调H最大值:60/2 = 30

饱和度S最小值:255*83%≈212

饱和度S最大值:255*100%=255

亮度V最小值:255*60%=153

亮度V最大值:255*100%=255


步骤3

        通过前一步的HSV范围提取,到了这一步我们就可以直接使用函数inRange()进行图像颜色空间的识别了,实现代码如下:

int iLowH = 20;
int iHighH = 30;
int iLowS = 0.83 * 255;
int iHighS = 255;
int iLowV = 0.60 * 255;
int iHighV = 255;
cvtColor(inImg, imgHSV, COLOR_BGR2HSV);//转为HSV
Mat imgThresholded;
inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded);

将原始图像转换成HSV图像后的效果如下:

图片5.jpg

经过颜色识别后的图像如下:

图片6.jpg

通过以上识别,我们可以发现,系统已经能够将图像中的黄色区域给扣取出来,为了能够更好的说明,系统颜色识别的准确性,我准备了这样一张图片,如下:

图片7.jpg

系统识别结果如下:

将原始图像转换成HSV图像后的效果如下:

图片8.jpg

经过颜色识别后的图像如下:

图片9.jpg

到了这一步,系统的颜色识别功能就完成了。


项目工程演示

        前面讲解了如何提取HSV颜色空间区间,下面我们来演示一下我们的C#、C++、Python三个版本的颜色识别demo。

        首先了,我们准备一张测试用的图片:

1.jpg


运行效果如下(C#):

1.gif


C#版本代码如下:

using OpenCvSharp;

namespace demo
{
    internal class Program
    {
        /// <summary>
        /// 颜色识别(除红色外的其他单色)
        /// </summary>
        /// <param name="srcImage"></param>
        /// <returns></returns>
        static Mat ColorFindContours(Mat srcImage,
            int iLowH, int iHighH,
            int iLowS, int iHighS,
            int iLowV, int iHighV)
        {
            Mat bufImg = new Mat();
            Mat imgHSV = new Mat();
            //转为HSV
            Cv2.CvtColor(srcImage, imgHSV, ColorConversionCodes.BGR2HSV);
            Cv2.InRange(imgHSV, new Scalar(iLowH, iLowS, iLowV), new Scalar(iHighH, iHighS, iHighV), bufImg);
            return bufImg;
        }

        /// <summary>
        /// 颜色识别(红色)
        /// </summary>
        /// <param name="srcImage"></param>
        /// <returns></returns>
        static Mat ColorFindContours2(Mat srcImage)
        {
            Mat des1 = ColorFindContours(srcImage,
              350 / 2, 360 / 2,         // 色调最小值~最大值
              (int)(255 * 0.70), 255,   // 饱和度最小值~最大值
              (int)(255 * 0.60), 255);  // 亮度最小值~最大值

            Mat des2 = ColorFindContours(srcImage,
               0, 16 / 2,               // 色调最小值~最大值
              (int)(255 * 0.70), 255,   // 饱和度最小值~最大值
              (int)(255 * 0.60), 255);  // 亮度最小值~最大值

            return des1 + des2;
        }

        /// <summary>
        /// 黄色识别
        /// </summary>
        static void demo1()
        {
            Mat g_srcImage = Cv2.ImRead("../../../images/color.jpg");
            Cv2.ImShow("原始图1", g_srcImage);

            Mat des = ColorFindContours(g_srcImage,
                45 / 2, 60 / 2,           // 色调最小值~最大值
                (int)(255 * 0.60), 255,   // 饱和度最小值~最大值
                (int)(255 * 0.90), 255);  // 亮度最小值~最大值

            Cv2.ImShow("demo1", des);
        }

        /// <summary>
        /// 红色识别
        /// </summary>
        static void demo2()
        {
            Mat g_srcImage = Cv2.ImRead("../../../images/color.jpg");
            Cv2.ImShow("原始图2", g_srcImage);
            Mat des = ColorFindContours2(g_srcImage);
            Cv2.ImShow("demo2", des);
        }

        static void Main(string[] args)
        {
            demo1();
            demo2();
            Cv2.WaitKey();
        }
    }
}


C++版本代码如下:

#include <opencv2/opencv.hpp>  
#include <opencv2/imgproc/imgproc.hpp>  

using namespace cv;

// 颜色识别(除红色外的其他单色)
Mat ColorFindContours(Mat srcImage,
    int iLowH, int iHighH,
    int iLowS, int iHighS,
    int iLowV, int iHighV)
{
    Mat bufImg;
    Mat imgHSV;
    //转为HSV
    cvtColor(srcImage, imgHSV, COLOR_BGR2HSV);
    inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), bufImg);
    return bufImg;
}

// 颜色识别(红色)
Mat ColorFindContours2(Mat srcImage)
{
    Mat des1 = ColorFindContours(srcImage,
        350 / 2, 360 / 2,         // 色调最小值~最大值
        (int)(255 * 0.70), 255,   // 饱和度最小值~最大值
        (int)(255 * 0.60), 255);  // 亮度最小值~最大值

    Mat des2 = ColorFindContours(srcImage,
        0, 16 / 2,                // 色调最小值~最大值
        (int)(255 * 0.70), 255,   // 饱和度最小值~最大值
        (int)(255 * 0.60), 255);  // 亮度最小值~最大值

    return des1 + des2;
}

int main()
{
    //载入色卡
    Mat srcImage = imread("../images/color.jpg");
    imshow("原始图", srcImage);

    // 黄色识别
    Mat des = ColorFindContours(srcImage,
        45 / 2, 60 / 2,          // 色调最小值~最大值
        (int)(255 * 0.60), 255,  // 饱和度最小值~最大值
        (int)(255 * 0.90), 255); // 亮度最小值~最大值
    imshow("des1", des);

    // 红色识别
    des = ColorFindContours2(srcImage);
    imshow("des2", des);

    waitKey(0);
    return 0;
}


Python版本代码如下:

import cv2
import numpy as np


def ColorFindContours(srcImage, iLowH, iHighH, iLowS, iHighS, iLowV, iHighV):
    # 转为HSV
    imgHSV = cv2.cvtColor(srcImage, cv2.COLOR_BGR2HSV)
    bufImg = cv2.inRange(imgHSV, np.array((iLowH, iLowS, iLowV)), np.array((iHighH, iHighS, iHighV)))
    return bufImg


def ColorFindContours2(srcImage):
    des1 = ColorFindContours(srcImage,
                             350 / 2, 360 / 2,  # 色调最小值~最大值
                             int(255 * 0.70), 255,  # 饱和度最小值~最大值
                             int(255 * 0.60), 255)  # 亮度最小值~最大值

    des2 = ColorFindContours(srcImage,
                             0, int(16 / 2),  # 色调最小值~最大值
                             int(255 * 0.70), 255,  # 饱和度最小值~最大值
                             int(255 * 0.60), 255)  # 亮度最小值~最大值

    return des1 + des2


# 载入色卡
srcImage = cv2.imread("../images/color.jpg")
# 显示原图
cv2.imshow("srcImage", srcImage)

des = ColorFindContours(srcImage,
                        45 / 2, 60 / 2,  # 色调最小值~最大值
                        int(255 * 0.60), 255,  # 饱和度最小值~最大值
                        int(255 * 0.90), 255)  # 亮度最小值~最大值
cv2.imshow("des1", des)

des = ColorFindContours2(srcImage)
cv2.imshow("des2", des)

cv2.waitKey(0)
cv2.destroyAllWindows()