OpenCV颜色识别

时间:2011-10-31 06:59:53

标签: python c opencv colors

您好我正在尝试构建简单的颜色识别程序。我拍摄了一张图像(黄色和粉红色)并将其转换为HSV色彩空间。然后使用阈值来识别黄色区域。我得到了输出(黑色图像)。我希望黄色区域充满颜色,并用黑色休息。


enter image description here enter 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 个答案:

答案 0 :(得分: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您的阈值应该有效,但您可能需要扩展阈值边界以捕捉图像中的黄色。

希望有所帮助!

答案 1 :(得分: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

这就是你的代码为我工作的原因。