基于Opencv实现颜色识别

  • 格式:pdf
  • 大小:96.40 KB
  • 文档页数:3

基于Opencv实现颜⾊识别

彩⾊模型

数字图像处理中常⽤的采⽤模型是RGB(红,绿,蓝)模型和HSV(⾊调,饱和度,亮度),RGB⼴泛应⽤于彩⾊监视器和

彩⾊视频摄像机,我们平时的图⽚⼀般都是RGB模型。⽽HSV模型更符合⼈描述和解释颜⾊的⽅式,HSV的彩⾊描述对⼈来

说是⾃然且⾮常直观的。

HSV模型

HSV模型中颜⾊的参数分别是:⾊调(H:hue),饱和度(S:saturation),亮度(V:value)。由A. R. Smith在1978年创

建的⼀种颜⾊空间, 也称六⾓锥体模型(Hexcone Model)。

(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)

if R = max, H = (G-B)/(max-min)

if G = max, H = 2 + (B-R)/(max-min)

if B = max, H = 4 + (R-G)/(max-min)

H = H * 60if H < 0, H = H + 360V=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的取值可以如下设置:

Orange 0-22,Yellow 22- 38,Green 38-75,Blue 75-130,Violet 130-160,Red 160-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)进⾏开操作和闭操作,去除噪声的影响。Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));

morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);

morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);

代码:

#include

#include

#include

using namespace cv;

using namespace std;

//⼊⼝主函数

int main(int argc, char** argv)

{

//打开摄像头,从摄像头获取图像

VideoCapture cap(0);

if (!cap.isOpened())

{

cout << "Cannot open the web cam"<

return -1;

}

//创建窗⼝

namedWindow("Control",CV_WINDOW_AUTOSIZE);

int iLowH = 100;

int iHighH = 140;

int iLowS = 90;

int iHighS = 255;

int iLowV = 90;

int iHighV = 255;

//创建进度条

cvCreateTrackbar("LowH","Control",&iLowH,179);

cvCreateTrackbar("HighH", "Control", &iHighH,179);

cvCreateTrackbar("LowS", "Control", &iLowS,255);

cvCreateTrackbar("Highs", "Control", &iHighS,255);

cvCreateTrackbar("LowV", "Control", &iLowV,255);

cvCreateTrackbar("HighV", "Control", &iHighV,255);

//while循环加载图⽚

while (true)

{

Mat imgOriginal;

bool bSuccess = cap.read(imgOriginal);

if (!bSuccess)

{

cout << "Cannot read a frame from video stream" << endl;

break;

}

//

Mat imgHSV;

vector hsvSplit;

cvtColor(imgOriginal,imgHSV,COLOR_BGR2HSV);

//转化成直⽅图均衡化

split(imgHSV,hsvSplit);

equalizeHist(hsvSplit[2],hsvSplit[2]);

merge(hsvSplit,imgHSV);

Mat imgThresholded;

//确定颜⾊显⽰的范围

inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS,iHighV),imgThresholded);

//去除噪点

Mat element = getStructuringElement(MORPH_RECT,Size(5,5));

morphologyEx(imgThresholded,imgThresholded,MORPH_OPEN,element);

//连接连通域

morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);

imshow("Thresholded Image",imgThresholded);

imshow("Original",imgOriginal);

//等待时间

char Key = (char)waitKey(300);

if (Key==27) {

break;

}

}

return 0;

}

以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。