视频中的颜色识别——opencv实现

颜色识别的原理

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

##结果
在这里插入图片描述

  • 15
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习水果识别是一种利用机器学习算法和图像处理技术对水果进行自动识别的方法。其,使用PythonOpenCV实现物体特征提取是一种常见的实现方式。 OpenCV是一个强大的开源计算机视觉库,提供了许多用于图像处理和分析的函数和工具。它可以辅助我们实现水果识别所需要的特征提取步骤。 首先,我们需要准备水果图像数据集。这些图像可以是不同种类的水果,每个水果都有多个不同视角的图像。接下来,我们使用OpenCV的函数加载和处理这些图像。 在特征提取,我们可以使用很多不同的技术。其,最常用的方法是使用图像的颜色和纹理特征。在处理图像时,我们可以使用OpenCV的函数计算这些特征。 例如,我们可以使用OpenCV的函数提取图像的颜色直方图。这可以帮助我们了解图像不同颜色的比例和分布情况。在水果识别,不同水果的颜色特征往往是不同的。 此外,我们还可以使用OpenCV的纹理特征提取方法,比如局部二值模式(Local Binary Patterns)。这可以帮助我们分析图像的纹理信息,如图像的细节和纹理变化。这些纹理特征在识别不同类型的水果时也是有用的。 最后,我们可以使用机器学习算法,如支持向量机(SVM)或卷积神经网络(CNN),来训练一个分类模型。这个模型可以根据提取的特征来判断输入图像是否为某种水果。 总之,使用PythonOpenCV实现水果识别的物体特征提取是一种非常有效的方法。通过提取图像的颜色和纹理特征,并使用机器学习算法进行分类,我们可以实现一个准确和高效的水果识别系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值