ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

计算机视觉 OpenCV【六:应用之颜色检测】

2021-04-29 21:30:40  阅读:669  来源: 互联网

标签:颜色 检测 Scalar OpenCV RGB HSV 视觉 255


目录

一、什么是颜色检测 

颜色检测步骤

二、HSV图像类型介绍

选择HSV进行颜色检测的原因

三、实例

1.RGB转HSV

2. 定义蒙版

3. 定义上下限

4.颜色检测,得到二值图像,并输出至蒙版 

5.番外:转换为实时跟踪检测,可调模式 

5.1 创建跟踪栏窗口

5.2  创建跟踪栏

5.3 写while循环 

效果


一、什么是颜色检测 

颜色检测就是对目标图像的所有像素点进行筛选,将符合指标的像素设置为白色,不符合指标的像素设置为黑色。

指标由上界和下界组成。

比如,我们要检测下面这一张图片:

在这里插入图片描述

我们准备检测黑色,也就是图中的杯子,以及猫的耳朵内部也有一点黑色部分,当然还有右边的墙角。

那么经过颜色检测后,我们能得到这样一张图:

在这里插入图片描述

这就是颜色检测的作用。

颜色检测步骤

1.将需要检测的RGB图像转换成HSV图像

2.定义Mat类型的一个对象:蒙版mask

3.定义颜色上下限

    其中上限是一个Scalar对象,包含三个值:hmin,smin,vmin,表示hsv三个要素的最小值;

    而下限也是一个Scalar对象,包含三个值:hmax,smax,vmax,表示hsv三个要素的最大值。

4.使用inRange函数,检测src图像的每一个像素是不是在lowerb和upperb之间

    如果是,这个像素就设置为255,并保存在mask图像中,否则为0。

 

二、HSV图像类型介绍

HSV是相对RGB的另一种颜色表示方式,它相对RGB而言,是一种比较直观的颜色模型。其中颜色的参数分别是:色调(H),饱和度(S),明度(V)。

色调H:
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;


饱和度S:
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。


明度V:
明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关,光照对此值影响最大。通常取值范围为0%(黑)到100%(白)。

一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给定一个严格的范围,下面是通过实验计算的模糊范围(准确的范围在网上都没有给出)。

H:  0— 180

S:  0— 255

V:  0— 255

此处把部分红色归为紫色范围:

选择HSV进行颜色检测的原因

数字图像处理中常用的采用模型是RGB(红,绿,蓝)模型和HSV(色调,饱和度,亮度),RGB广泛应用于彩色监视器和彩色视频摄像机,我们平时的图片一般都是RGB模型。

相对于RGB空间,HSV空间能够非常直观的表达色彩的明暗,色调,以及鲜艳程度,方便进行颜色之间的对比。

所以我们在颜色检测时,选用HSV图像。

下图为RGB VS HSV

三、实例

要检测的原图:

1.RGB转HSV

    //定义图片路径
	string path = "Resources/lambo.png";
	Mat img = imread(path);
	//定义HSV类型图片
	Mat imgHSV;
    //转换
	cvtColor(img, imgHSV, COLOR_BGR2HSV);

2. 定义蒙版

	//定义蒙版
	Mat mask;

3. 定义上下限

        //定义颜色上下限
		Scalar lower(hmin, smin, vmin);
		Scalar upper(hmax, smax, vmax);

4.颜色检测,得到二值图像,并输出至蒙版 

		//收集颜色
        //定义颜色上下限
        int hmin = 0, smin = 110, vmin = 153;
        int hmax = 19, smax = 240, vmax = 255;
		Scalar lower(hmin, smin, vmin);
		Scalar upper(hmax, smax, vmax);
		//输出的是遮罩,蒙版
		inRange(imgHSV, lower, upper, mask);

这里我们检测的是橙色,上述hsv的上下限就是橙色的对应上下限。 

效果如下: 

5.番外:转换为实时跟踪检测,可调模式 

5.1 创建跟踪栏窗口

	//创建跟踪栏窗口
	namedWindow("Trackbars", (640, 200));

5.2  创建跟踪栏

    //创建跟踪栏
	createTrackbar("Hue Min", "Trackbars", &hmin, 179);
	createTrackbar("Hue Max", "Trackbars", &hmax, 179);
	createTrackbar("Sat Min", "Trackbars", &smin, 255);
	createTrackbar("Sat Max", "Trackbars", &smax, 255);
	createTrackbar("Val Min", "Trackbars", &vmin, 255);
	createTrackbar("Val Max", "Trackbars", &vmax, 255);

5.3 写while循环 

while (1)
	{
		//收集颜色
        //定义颜色上下限
		Scalar lower(hmin, smin, vmin);
		Scalar upper(hmax, smax, vmax);
		//输出的是遮罩,蒙版
		inRange(imgHSV, lower, upper, mask);
		//展示
		imshow("Image", img);
		imshow("ImageHSV", imgHSV);
		imshow("ImageMask", mask);
		waitKey(1);
	}

这里要注意,和网络摄像头一样,我们需要设置waitKey为1毫秒。 

效果

标签:颜色,检测,Scalar,OpenCV,RGB,HSV,视觉,255
来源: https://blog.csdn.net/Kukeoo/article/details/116245337

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有