iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >基于opencv实现视频中的颜色识别功能
  • 329
分享到

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

2024-04-02 19:04:59 329人浏览 独家记忆
摘要

目录颜色识别的原理OpenCV中的颜色模型颜色识别的实现(c++)颜色识别的原理 opencv中的颜色模型 RGB RGB具有三个通道其,分别表示红色通道®,绿色通道(G),

颜色识别的原理

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]);
			
			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颜色识别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 基于opencv实现视频中的颜色识别功能

本文链接: https://www.lsjlt.com/news/165024.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 基于opencv实现视频中的颜色识别功能
    目录颜色识别的原理opencv中的颜色模型颜色识别的实现(c++)颜色识别的原理 opencv中的颜色模型 RGB RGB具有三个通道其,分别表示红色通道®,绿色通道(G),...
    99+
    2022-11-13
  • Python+OpenCV实现基于颜色的目标识别
    目录任务主要代码效果展示学习了一点opencv的知识于是找了个小项目来实践一下。这里先说明一下,我的实现方法不见得是最好的(因为这只是一个用于练习的项目)仅作参考,也欢迎各位大佬指正...
    99+
    2022-11-12
  • Python+OpenCV如何实现基于颜色的目标识别
    这篇文章给大家介绍Python+OpenCV如何实现基于颜色的目标识别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。任务让摄像头识别到视野范围内的气球并返回每个气球的中心点坐标。因为场地固定,背景单一,所以省下来很多操...
    99+
    2023-06-22
  • Python+OpenCV实现图片及视频中选定区域颜色识别
    近期,需要实现检测摄像头中指定坐标区域内的主体颜色,通过查阅大量相关的内容,最终实现代码及效果如下,具体的实现步骤在代码中都详细注释,代码还可以进一步优化,但提升有限。 主要实现过程...
    99+
    2022-11-11
  • python+opencv实现文字颜色识别与标定功能
            最近接了一个比较简单的图像处理的单子,花了一点时间随便写了一下:  数据集客户没有是自...
    99+
    2022-11-12
  • 基于Python的人脸识别功能怎么实现
    这篇文章主要介绍“基于Python的人脸识别功能怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“基于Python的人脸识别功能怎么实现”文章能帮助大家解决问题。一、 人脸检测人脸检测是指从图像...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作