基于opencv实现视频中的颜色识别功能

 更新时间:2022年07月22日 16:11:50   作者:chenguanging080  
这篇文章主要介绍了基于opencv实现视频中的颜色识别功能,文章详细介绍了颜色识别的原理及opencv中的颜色模型,基于c++代码实现颜色识别功能,需要的朋友可以参考下

颜色识别的原理

opencv中的颜色模型

RGB

RGB具有三个通道其,分别表示红色通道®,绿色通道(G),蓝色通道(B),3个通道在opencv中的取值均为0~255,它的颜色由3个通道的取值来共同决定,因此如果使用RGB图像来进行颜色的识别,会丢失很多的颜色。

HSV

HSV具有三个通道,其分别表示色调(H),饱和度(S),亮度(V),3个通道在opencv中的取值分别如下:

  • H:0~180
  • S:0~255
  • V:0~255

其中H通道和S通道决定了颜色,V通道决定亮度
各种颜色对应的三个通道的取值表如下:

在这里插入图片描述

因此通过限制HSV通道中相对应的数值,就可以识别出对应的颜色

颜色识别的实现(c++)

1.读取摄像头的实时画面

VideoCapture capture(1);//0为电脑本身摄像头,1位外置摄像头

2.读取摄像头的当前一帧的数据并转换到HSV空间

capture >> frame; //读取当前帧
cvtColor(frame, imgHSV, COLOR_BGR2HSV);

3.对HSV图像进行直方图均衡化
在此处使用直方图均衡化是因为可以使用这种方法可以使原来比较少像素的灰度会被分配到别的灰度去,像素相对集中, 处理后灰度范围变大,对比度变大,清晰度变大,所以能有效增强图像。

split(imgHSV,temporary);
equalizeHist(temporary[2], temporary[2]);
merge(temporary, imgHSV);   //将HSV图像分割通道,并且做直方图的均衡化

使用equalizeHist()函数,其输入必须是单通道的,因此使用split函数将得到的HSV图像分割为三个通道之后,在进行直方图均衡化,然后再使用merge函数来合并三个通道。
此处仅对V通道进行了直方图均衡化,因为通过比对发现只对V通道进行效果最好,具体的原因还不清楚。

4.将直方图均衡化之后,使用inRange()函数来进行图像的识别

inRange(imgHSV, Scalar(H_W_L, S_W_L, V_W_L), Scalar(H_W_H, S_W_H, V_W_H), image);

其中H_W_L,H_W_L, S_W_L, V_W_L. . . 等数值分别为前面表格对应的颜色值的最小值和最大值。
此函数是将在范围内的像素值为255,其与为0,反映到图像上就是,选中的颜色为白色,其与的均为黑色。
操作到此颜色可以进行识别,但是效果可能不会很好,因此可以再使用开操作来消除噪点,去掉小的干扰快,再使用闭操作来填充闭合区域。

5.开操作

kernel = getStructuringElement(MORPH_RECT, Size(3, 3));//3*3的矩形卷积核,只要是奇数的都可以
morphologyEx(image,image,2,kernel);

6.闭操作

morphologyEx(image,image,3,kernel);

源代码

#include <opencv2\opencv.hpp>  
using namespace cv;
using namespace std;
int main()
{
	Mat frame,imgHSV,image,kernel;
	vector<Mat>temporary;
	int H_W_L = 0, H_W_H = 180;
	int S_W_L = 0, S_W_H = 30;
	int V_W_L = 221, V_W_H = 255;
	VideoCapture capture(1);//读取视摄像头实时画面数据,0默认是笔记本的摄像头;如果是外接摄像头,这里改为1
	while (true)
	{
		capture >> frame; //读取当前帧
		
		if (!frame.empty())
		{          //判断输入的视频帧是否为空的
			cvtColor(frame, imgHSV, COLOR_BGR2HSV);
			//threshold(gray, two_value, 125, 255, THRESH_BINARY);//二值图像
			
			split(imgHSV,temporary);
			equalizeHist(temporary[2], temporary[2]);
			/*equalizeHist(temporary[1], temporary[1]);
			equalizeHist(temporary[0], temporary[0]);*/
			merge(temporary, imgHSV);   //将HSV图像分割通道,并且做直方图的均衡化
			inRange(imgHSV, Scalar(H_W_L, S_W_L, V_W_L), Scalar(H_W_H, S_W_H, V_W_H), image);
			kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
			morphologyEx(image,image,2,kernel);
			morphologyEx(image,image,3,kernel);
			imshow("直方图", imgHSV);
			imshow("原图",frame);
			imshow("window", image);  //在window窗口显示frame摄像头数据画面
		}
		if (waitKey(20) == 'q')   //延时20ms,获取用户是否按键的情况,如果按下q,会推出程序 
			break;
	}
	capture.release();     //释放摄像头资源
	destroyAllWindows();   //释放全部窗口
	return 0;
}

##结果

在这里插入图片描述

到此这篇关于基于opencv实现视频中的颜色识别的文章就介绍到这了,更多相关OpenCV颜色识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • VC++实现CStdioFile写入及读取文件并自动换行的方法

    VC++实现CStdioFile写入及读取文件并自动换行的方法

    这篇文章主要介绍了VC++实现CStdioFile写入及读取文件并自动换行的方法,很实用的功能,需要的朋友可以参考下
    2014-08-08
  • C++如何实现sha256算法

    C++如何实现sha256算法

    SHA-256算法由于其强大的安全性,已成为国际标准和许多安全协议的推荐算法,在密码存储、数字签名、区块链技术、SSL/TLS协议、数据完整性验证、系统安全审计等众多应用领域,SHA-256算法都至关重要,这篇文章主要介绍了C++如何实现sha256算法,需要的朋友可以参考下
    2024-07-07
  • 关于STL中set容器的一些总结

    关于STL中set容器的一些总结

    关于set,必须说明的是set关联式容器。set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序
    2013-09-09
  • 双缓冲解决VC++绘图时屏幕闪烁

    双缓冲解决VC++绘图时屏幕闪烁

    相信很多人在做图形界面开发时,常常会遇到屏幕闪烁的情况,当然我也不例外,下面我们就来详细探讨下这个问题的解决办法
    2015-08-08
  • C语言中指针和数组试题详解分析

    C语言中指针和数组试题详解分析

    变量存放在内存中,内存其实就是一组有序字节组成的数组,每个字节有唯一的内存地址。CPU 通过内存寻址对存储在内存中的某个指定数据对象的地址进行定位。数据对象是指存储在内存中的一个指定数据类型的数值或字符串,它们都有一个自己的地址,指针是保存这个地址的变量
    2021-10-10
  • C语言实现变色进度条

    C语言实现变色进度条

    这篇文章主要为大家详细介绍了C语言实现一个变色的进度条,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Mac OS上搭建Apache+PHP+MySQL开发环境的详细教程

    Mac OS上搭建Apache+PHP+MySQL开发环境的详细教程

    这篇文章主要介绍了Mac OS上搭建Apache+PHP+MySQL开发环境的详细教程,包括常见的PHP连接MySQL失败问题的解决办法,需要的朋友可以参考下
    2016-01-01
  • C语言代码实现通讯录管理系统

    C语言代码实现通讯录管理系统

    这篇文章主要为大家详细介绍了C语言代码实现通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • C++中的friend友元函数详细解析

    C++中的friend友元函数详细解析

    友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类。友元函数的特点是能够访问类中的私有成员的非成员函数。友元函数从语法上看,它与普通函数一样,即在定义上和调用上与普通函数一样
    2013-09-09
  • C语言的递归思想实例分析

    C语言的递归思想实例分析

    这篇文章主要介绍了C语言的递归思想,以一个实例的形式针对数据变化规律分析了递归思想的本质,需要的朋友可以参考下
    2014-09-09

最新评论