2013-10-04 122 views
2

我想从实时视频流中检测出特定的颜色,例如蓝色。 我写了下面的代码,它显示实时视频流并将其更改为HSV和灰度。由于我对opencv完全陌生,因此我不知道下一步该怎么做。opencv中的颜色检测

有人可以为我完成代码来检测特定的颜色。

#include<opencv\cv.h> 
#include<opencv\highgui.h> 

using namespace cv; 


int main(){ 
Mat image; 
Mat gray; 
Mat hsv; 
VideoCapture cap; 
cap.open(0); 
namedWindow("window", CV_WINDOW_AUTOSIZE); 
namedWindow("gray", CV_WINDOW_AUTOSIZE); 
namedWindow("hsv", CV_WINDOW_AUTOSIZE); 

while (1){ 
    cap >> image; 
    cvtColor(image, gray, CV_BGR2GRAY); 
    cvtColor(image, hsv, CV_BGR2HSV); 
    imshow("window", image); 
    imshow("gray", gray); 
    imshow("hsv", hsv); 
    waitKey(33); 
} 
return 0; 
} 
+0

请在这里发帖前尝试在线搜索。简单来看,我发现这个页面解释了OpenCV中的颜色检测:http://opencv-srf.blogspot.com/2010/09/object-detection-using-color-seperation.html – fintelia

+0

谢谢!我已经浏览过那个网站,但什么都不懂,但是最终经过一些阅读后,我能够理解该网站给出的代码。 – BBB

回答

9

可以分三个步骤做到这一点:

  1. 负载框架。
  2. 将BGR转换为HSV色彩空间。
  3. Inrange之间的颜色范围来检测。

编辑

您可以使用此code找到任何像素从源图像的HSV值。你可以看到关于HSV色彩空间here的一个很好的解释,从那里下载HSV色盘并手动找出HSV色域。

以下范围可用于在the comments提供的图像:

hsv_min--> (106,60,90) 
hsv_max-->(124,255,255) 

以下代码可被用于:

Mat src=imread("image.jpg"); 
Mat HSV; 
Mat threshold; 

cvtColor(src,HSV,CV_BGR2HSV); 
inRange(HSV,Scalar(106,60,90),Scalar(124,255,255),threshold); 
imshow("thr",threshold);  

这是输出:

enter image description here

+0

我有一个问题。我可以转换为HSV,但我究竟如何找到“inRange”,因为我的颜色可能会略有不同。 看一看这张图片: http://i.stack.imgur.com/0xud4.jpg – Sohaib

+1

看到我编辑的答案。 – Haris

+0

非常感谢。它总是受到打击和审判?我们怎么能说一个特定的颜色在一个范围之间。例如,我使用(3,50,50)和(19,240,240)这样的东西作为我的范围。 但它会错过几个标记。当我将初始范围更改为(3,70,50)时,检测到更多标记,但一些早期标记消失。我实在无法理解这个概念。 – Sohaib