主页 > 区块链钱包 > [imtoken最新版下载最新]基于opencv实现视频中的颜色识别功能

[imtoken最新版下载最新]基于opencv实现视频中的颜色识别功能

admin 区块链钱包 2022年07月27日
各种颜色对应的三个通道的取值表如下:

操作到此颜色可以进行识别,但是效果可能不会很好,因此可以再使用开操作来消除噪点,去掉小的干扰快,再使用闭操作来填充闭合区域。

5.开操作

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

6.闭操作

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

使用equalizeHist()函数,其输入必须是单通道的,因此使用split函数将得到的HSV图像分割为三个通道之后,在进行直方图均衡化,然后再使用merge函数来合并三个通道。
此函数是将在范围内的像素值为255,其与为0,反映到图像上就是,选中的颜色为白色,其与的均为黑色。
VideoCapture capture(1);//0为电脑本身摄像头,1位外置摄像头

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

HSV

关于基于opencv实现视频中的颜色识别的文章就介绍至此,更多相关OpenCV颜色识别内容请搜索编程宝库以前的文章,希望以后支持编程宝库!

其中H通道和S通道决定了颜色,V通道决定亮度

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

V:0~255

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

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

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

H:0~180

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

3.对HSV图像进行直方图均衡化

在这里插入图片描述

此处仅对V通道进行了直方图均衡化,因为通过比对发现只对V通道进行效果最好,具体的原因还不清楚。

#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; }

##结果

S:0~255

getchar()的描述以及用法getchar()是stdio.h中的库函数,它的作用是从缓冲区中读取一个字符,如果缓冲区中没有字符可供读取,它就会等待终端键盘输入字符,按回车键表示输入结束 ...

下一节:C语言库函数getchar()新见解C语言编程技术

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

在这里插入图片描述

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

基于opencv实现视频中的颜色识别功能 颜色识别的原理 opencv中的颜色模型

RGB

morphologyEx(image,image,3,kernel);

源代码

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. . . 等数值分别为前面表格对应的颜色值的最小值和最大值。

本文网络收集整理,不构成任何投资建议。转载请注明出处:https://www.bnlive.com.cn/qklqb/8747.html