【opencv学习笔记】2用摄像头识别指定颜色

一般对颜色空间的图像进行有效处理都是在HSV空间进行的。

观察彩色物体时,我们用其色调、饱和度和明度来描述这个物体。

色调用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;

饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和;

明度V表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

以上转自百度百科https://baike.baidu.com/item/HSV/547122?fr=aladdin。

 
    一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给定一个严格的范围,下面是通过实验计算的模糊范围(准确的范围在网上都没有给出)。
H:  0 — 180 

S:  0 — 255 

V:  0 — 255

【opencv学习笔记】2用摄像头识别指定颜色_第1张图片

以上转自百度文库https://wenku.baidu.com/view/eb2d600dbb68a98271fefadc.html

颜色空间转换函数:cvtColor( )

默认图片一般为RGB图,但是opencv默认的图片通道存储顺序是BGR,即红绿蓝。

本程序实例:

cvtColor(srcImage,dstImage,COLOR_BGR2HSV);

BGR动态地址与HSV一一对应;

所以提取图片HSV值写法:

 

H = hsvframe.at<Vec3b>(i, j)[0];

S = hsvframe.at<Vec3b>(i, j)[1];

V = hsvframe.at<Vec3b>(i, j)[2];

 

此程序为红色提取,范围是:

 

((H >= 0 && H <= 10) || (H >= 156 && H <= 180)) && S >= 43 && V >= 46

 

摄像头开启程序:

VideoCapture capture(0);

图像显示:

 

capture >> frame;

imshow("读取视频", frame);

 

程序如下:

 

#include   

using namespace cv;

void PickupRed(Mat& inputframe,Mat& outputframe);



int main()

{

VideoCapture capture(0);

while (1)

{

Mat frame;
Mat dstframe;
Mat redframe;
capture >> frame;
imshow("读取视频", frame);
PickupRed(frame, redframe);
imshow("视频", redframe);
waitKey(30);

}

return 0;

}





void PickupRed(Mat&inputframe, Mat& outputframe)

{

Mat hsvframe;

cvtColor(inputframe, hsvframe, COLOR_BGR2HSV);

outputframe = Mat(hsvframe.rows, hsvframe.cols,CV_8UC3, cv::Scalar(255, 255, 255));

int rowNumber = hsvframe.rows;

int colNumber = hsvframe.cols;

double H = 0.0, S = 0.0, V = 0.0;

for (int i = 0; i < rowNumber; i++)

{

for (int j = 0; j < colNumber; j++)

{

H = hsvframe.at(i, j)[0];

S = hsvframe.at(i, j)[1];

V = hsvframe.at(i, j)[2];


if (((H >= 0 && H <= 10) || (H >= 156 && H <= 180)) && S >= 43 && V >= 46)

{

outputframe.at(i, j)[0] =inputframe.at(i, j)[0];

outputframe.at(i, j)[1] =inputframe.at(i, j)[1];

outputframe.at(i, j)[2] =inputframe.at(i, j)[2];

}


}

}

}

此程序没有对图片进行其他处理,效果一般。

 

 

 

你可能感兴趣的:(图像处理,VS2015,opencv,图像处理)