2011-10-31 176 views
2

嗨我想建立简单的颜色识别程序。我拍了一张图片(黄色&粉色),并将其转换为HSV色彩空间。然后使用阈值来识别黄色区域。我得到输出(黑色图像)。我想让黄色区域充满色彩,用黑色休息。OpenCV颜色识别


enter image description hereenter image description here


IplImage *imgRead= cvLoadImage("yellow.jpeg",CV_LOAD_IMAGE_COLOR); 
if(!imgRead) { 
fprintf(stderr, "Error in reading image\n"); 
exit(1); 
} 
IplImage *imgHsv = cvCreateImage(cvGetSize(imgRead),8, 3); 
cvCvtColor(imgRead, imgHsv,CV_BGR2HSV); 

IplImage *imgThreshold = cvCreateImage(cvGetSize(imgRead),8, 1); 
cvInRangeS(imgHsv, cvScalar(25, 80, 80,80), cvScalar(34, 255, 255,255), imgThreshold); 
cvShowImage("image",imgThreshold); 
cvWaitKey(0); 

在上面的代码中我已经计算HSV值用于黄色作为30.(用于黄色色在GIMP HSV值是60)。在cvInRangeS中,除了色调值,我不确定如何指定cvScalar的其他值。

我需要放什么样的价值?我错过了什么?

回答

2

我跑你的代码,它工作正常。也许图像中的黄色不像你想象的那么黄。

enter image description here

编辑:的其他潜在的区别是,我使用的OpenCV 2.3。你正在使用哪个版本?

好的,多一个编辑:你有没有试过看你的黄色值?这会给你一个明确的答案,你应该在cvInRangeS中使用什么值。调用cvCvtColor后添加以下两行:

uchar* ptr = (uchar*)(imgHsv->imageData); 
printf("H: %d, S:%d, V:%d\n", ptr[0], ptr[1], ptr[2]); 

对于我的形象,我得到:

H: 30, S:109, V:255 

这就是为什么你的代码为我工作。

+0

嗨,我使用OpenCV 2.1.0.3。即时通讯使用Ubuntu的1104,64位。在突触中它显示这是最新版本。我认为64位的存储库不会像32位那样定期更新。我插入了行,我得到了值** H:30,S:255,V:25​​5 ** – Netro

+0

我刚刚意识到你的标量中有第四个值。该第四个值的行为可能是未定义的,因为它是3通道图像。你应该将该行更改为'cvInRangeS(imgHsv,cvScalar(25,80,80),cvScalar(34,255,255),imgThreshold);' – SSteve

+0

好吧,我刚刚将阈值的上限范围增加到255(256) 35,256,256,256),它工作。 ** cvInRangeS(imgHsv,cvScalar(25,245,245,0),cvScalar(35,256,256,256),imgThreshold); **。我应该注意到** cvInRangeS/* dst(idx)= lower <= src(idx) Netro

4

我想你所遇到的问题是由于HSV数据的缩放以适应8位。通常情况下,我敢肯定你使用GIMP注意到HSV尺度如下:

H -> [0, 360] 
S -> [0, 100] 
V -> [0, 100] 

但是,OpenCV的如下重新映射这些值:

(H/2) -> [0, 180] (so that the H values can be stored in 8-bits) 
S  -> [0, 255] 
V  -> [0, 255] 

这就是为什么你计算出的Hue值是30而不是60.所以,要滤除除黄色以外的所有颜色,你的cvInRangeS调用看起来像这样:

cvInRangeS(imgHsv, cvScalar(25, 245, 245, 0), cvScalar(35, 255, 255, 255), imgThreshold); 

第四信道是未用于HSV。这个调用会给你每个维度的色彩检测器阈值的10个计数噪声。

正如所提到的,SSteve您的门槛应该工作,但你可能需要扩大您的门槛界限捕获黄十岁上下的颜色在你的形象。

希望有帮助!

+0

我扩大了范围。它现在有效。 thnks – Netro

+0

太棒了!很高兴我们可以帮忙! – mevatron