OpenCV颜色识别

2024-09-29 23:26:06 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我正在尝试建立一个简单的颜色识别程序。我已经采取了一个图像(黄色和粉红色)和转换它在HSV颜色空间。然后利用阈值识别黄色区域。我得到输出(黑色图像)。我要黄色区域填充,而颜色和黑色休息。在


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指定其他值。在

我需要输入什么值?我有遗漏什么吗?在


Tags: 图像image区域颜色hsvcv黑色黄色
2条回答

我运行了你的代码,运行得很好。也许你形象中的黄色并不像你想象的那么黄。在

enter image description here

编辑:另一个潜在的区别是我使用的是opencv2.3。你用的是哪个版本?在

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

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

对于我的形象,我得到了:

^{pr2}$

所以你的代码对我有用。在

我想你现在遇到的问题是由于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]

这就是为什么您计算的色调值是30而不是60。因此,要过滤掉除黄色以外的所有颜色,cvInRangeS调用如下所示:

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

第四个通道不用于HSV。这个调用将给你10计数噪声在你的颜色检测器阈值为每个维度。在

如前所述,您的阈值应该可以工作,但是您可能需要扩展阈值边界来捕捉图像中的黄色。在

希望有帮助!在

相关问题 更多 >

    热门问题