opencv颜色识别-红色

前言

在进行opencv的颜色处理的时候,发现HSV通道进行阈值化的效果优于BGR通道,因此采用了HSV通道进行阈值划分,但是在识别红色时发现了一个问题,在opnecv中,HSV通道被划分为以下范围

H -0-180)
S -0-255)
V -0-255

在进行红色的识别时,发现怎么搞色块中都存在部分空缺,也就是无法识别的红色,如下图

于是上网查询了HSV的具体颜色划分,见下表

opencv颜色识别-红色_第1张图片

由此得知,在HSV通道中,红色的色调(H)存在着两个范围,因此使用单一的阈值化无法正确的将红色进行分离出来。

解决方法

通过对两个阈值的二值化发现,两个范围的红色识别二值化图像刚好是互补的,于是想到使用像素操作,将两个图像进行相加,使两者白色部分融合,黑色部分保留。效果如下图
opencv颜色识别-红色_第2张图片
代码如下

Mat image_Processing(Mat imgOriginal)
{
	Mat imgHSV, imgBGR;
	Mat imgThresholded;
	imshow("chushi", imgOriginal);
	GaussianBlur(imgOriginal, imgOriginal, Size(7, 7), 0, 0);
	imshow("gaosi", imgOriginal);
	vector<Mat> hsvSplit;   //创建向量容器,存放HSV的三通道数据
	cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV); //Convert the captured frame from BGR to HSV
	split(imgHSV, hsvSplit);			//分类原图像的HSV三通道
	equalizeHist(hsvSplit[2], hsvSplit[2]);    //对HSV的亮度通道进行直方图均衡
	merge(hsvSplit, imgHSV);				   //合并三种通道
	Mat ce1;
	Mat ce2;
	Mat ce3;
	inRange(imgHSV, Scalar(156, 43, 46), Scalar(180, 255, 255), imgThresholded); //红色
	inRange(imgHSV, Scalar(156, 43, 46), Scalar(180, 255, 255), ce1); //红色
	inRange(imgHSV, Scalar(0, 43, 46), Scalar(3, 255, 255), ce2); //红色
	add(ce1,ce2,ce3,Mat());
	imshow("0-10", ce1);
	imshow("156-180",ce2);
	imshow("add后", ce3);
}

结束

至此,问题解决。
你永远不知道别人有多努力,因此请别停下来 --致彭某

opencv颜色识别-红色_第3张图片

你可能感兴趣的:(opencv,计算机视觉,人工智能)