您的位置:首页 > 运维架构

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

2017-10-13 22:29 621 查看
一般对颜色空间的图像进行有效处理都是在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



以上转自百度文库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 <opencv2\opencv.hpp>  
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<Vec3b>(i, j)[0];
S = hsvframe.at<Vec3b>(i, j)[1];
V = hsvframe.at<Vec3b>(i, j)[2];
 
if (((H >= 0 && H <= 10) || (H >= 156 && H <= 180)) && S >= 43 && V >= 46)

{
outputframe.at<Vec3b>(i, j)[0] =inputframe.at<Vec3b>(i, j)[0];
outputframe.at<Vec3b>(i, j)[1] =inputframe.at<Vec3b>(i, j)[1];
outputframe.at<Vec3b>(i, j)[2] =inputframe.at<Vec3b>(i, j)[2];
}

}
}
}
 
此程序没有对图片进行其他处理,效果一般。
 
 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  VS2015 opencv 图像处理