【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];
}
}
}
}
此程序没有对图片进行其他处理,效果一般。
观察彩色物体时,我们用其色调、饱和度和明度来描述这个物体。
色调用角度度量,取值范围为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];
}
}
}
}
此程序没有对图片进行其他处理,效果一般。
相关文章推荐
- OpenCV-009:识别摄像头图像中的指定颜色并显示
- 【OpenCV学习笔记】三十一、轮廓特征属性及应用(八)——颜色物体识别与跟踪
- OpenCV学习 物体检测 人脸识别 填充颜色
- Opencv Python版学习笔记(八)字符识别-分类器(SVM,KNearest,RTrees,Boost,MLP)
- 自动车牌识别(ANPR)练习项目学习笔记2(基于opencv)
- 【OpenCV学习笔记】2:开启摄像头和对捕获到的图像的处理
- OpenCV学习笔记[3]Java Demo人脸识别
- Kinect开发学习笔记之(四)提取颜色数据并用OpenCV显示
- opencv学习(十)(opencv3.0.0+VS2012+win7)打开摄像头并且进行人脸识别的例子
- 【OpenCV学习笔记 014】人脸人眼识别
- OpenCV学习笔记(五十五)——用OpenCV做人脸识别和性别识别contrib
- opencv学习系列(二)---颜色识别
- OpenCV学习笔记(9)利用MFC的Picture控件显示图像+播放视频和捕获摄像头画面
- Python OpenCV学习笔记之:摄像头使用
- 【OpenCV学习笔记 022】人脸识别 小试牛刀
- OpenCV学习笔记-读取摄像头
- python OpenCV学习笔记(八):改变颜色空间
- 【opencv学习之六】opencv+Qt+Qzxing调取本地摄像头识别二维码
- 像素临近区域、颜色通道、ROI区域的访问---opencv.2学习笔记2
- Kinect开发学习笔记之(四)提取颜色数据并用OpenCV显示(转)