基于Opencv实现颜色识别
彩色模型
数字图像处理中常用的采用模型是RGB(红,绿,蓝)模型和HSV(色调,饱和度,亮度),RGB广泛应用于彩色监视器和彩色视频摄像机,我们平时的图片一般都是RGB模型。而HSV模型更符合人描述和解释颜色的方式,HSV的彩色描述对人来说是自然且非常直观的。
HSV模型
HSV模型中颜色的参数分别是:色调(H:hue),饱和度(S:saturation),亮度(V:value)。由A.R.Smith在1978年创建的一种颜色空间,也称六角锥体模型(HexconeModel)。
(1)色调(H:hue):用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
(2)饱和度(S:saturation):取值范围为0.0~1.0,值越大,颜色越饱和。
(3)亮度(V:value):取值范围为0(黑色)~255(白色)
RGB转成HSV
设(r,g,b)分别是一个颜色的红、绿和蓝坐标,它们的值是在0到1之间的实数。设max等价于r,g和b中的最大者。设min等于这些值中的最小者。要找到在HSV空间中的(h,s,v)值,这里的h∈[0,360)是角度的色相角,而s,v∈[0,1]是饱和度和亮度,方法如下:
max=max(R,G,B)
min=min(R,G,B)
ifR=max,H=(G-B)/(max-min)
ifG=max,H=2+(B-R)/(max-min)
ifB=max,H=4+(R-G)/(max-min)
H=H*60
ifH<0,H=H+360
- V=max(R,G,B)
- S=(max-min)/max
OpenCV下有个函数可以直接将RGB模型转换为HSV模型,OpenCV中H∈[0,180),S∈[0,255],V∈[0,255]。我们知道H分量基本能表示一个物体的颜色,但是S和V的取值也要在一定范围内,因为S代表的是H所表示的那个颜色和白色的混合程度,也就说S越小,颜色越发白,也就是越浅;V代表的是H所表示的那个颜色和黑色的混合程度,也就说V越小,颜色越发黑。经过实验,识别蓝色的取值是H在100到140,S和V都在90到255之间。一些基本的颜色H的取值可以如下设置:
Orange0-22,Yellow22-38,Green38-75,Blue75-130,Violet130-160,Red160-179
具体实现
(1)读取一张图片
cvtColor(imgOriginal,imgHSV,COLOR_BGR2HSV);
(2)将彩色图像均衡化
split(imgHSV,hsvSplit); equalizeHist(hsvSplit[2],hsvSplit[2]); merge(hsvSplit,imgHSV);
(3)检测颜色
inRange(imgHSV,Scalar(iLowH,iLowS,iLowV),Scalar(iHighH,iHighS,iHighV),imgThresholded);
(4)进行开操作和闭操作,去除噪声的影响。
Matelement=getStructuringElement(MORPH_RECT,Size(5,5)); morphologyEx(imgThresholded,imgThresholded,MORPH_OPEN,element); morphologyEx(imgThresholded,imgThresholded,MORPH_CLOSE,element);
代码:
#include#include #include usingnamespacecv; usingnamespacestd; //入口主函数 intmain(intargc,char**argv) { //打开摄像头,从摄像头获取图像 VideoCapturecap(0); if(!cap.isOpened()) { cout<<"Cannotopenthewebcam"< hsvSplit; cvtColor(imgOriginal,imgHSV,COLOR_BGR2HSV); //转化成直方图均衡化 split(imgHSV,hsvSplit); equalizeHist(hsvSplit[2],hsvSplit[2]); merge(hsvSplit,imgHSV); MatimgThresholded; //确定颜色显示的范围 inRange(imgHSV,Scalar(iLowH,iLowS,iLowV),Scalar(iHighH,iHighS,iHighV),imgThresholded); //去除噪点 Matelement=getStructuringElement(MORPH_RECT,Size(5,5)); morphologyEx(imgThresholded,imgThresholded,MORPH_OPEN,element); //连接连通域 morphologyEx(imgThresholded,imgThresholded,MORPH_CLOSE,element); imshow("ThresholdedImage",imgThresholded); imshow("Original",imgOriginal); //等待时间 charKey=(char)waitKey(300); if(Key==27) { break; } } return0; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。