OpenCV:HSV inRange 返回压缩并重复的二进制图像

Posted

技术标签:

【中文标题】OpenCV:HSV inRange 返回压缩并重复的二进制图像【英文标题】:OpenCV: HSV inRange returns binary image squashed and repeated 【发布时间】:2014-05-26 14:55:04 【问题描述】:

我在转换图像以进行颜色识别时遇到了一些问题。

函数如下所示:

void PaintHSVWindow(cv::Mat img)
cv::Mat HSV, threshold; 
cvtColor(img, HSV, COLOR_BGR2HSV);
inRange(HSV, cv::Scalar(HMin, SMin, VMin), cv::Scalar(HMax, SMax, VMax), threshold);
Mat erodeElement = getStructuringElement(MORPH_RECT, cv::Size(3, 3));
Mat dilateElement = getStructuringElement(MORPH_RECT, cv::Size(8, 8));
erode(threshold, threshold, erodeElement);
dilate(threshold, threshold, dilateElement);
cv::resize(threshold, threshold, cv::Size(360, 286));
MyForm::setHSVWindow(threshold);

输出如下:

左边是输入。右边是假定是相同的图像,转换为 HSV,在给定阈值之间过滤以找到黄色球,腐蚀和扩张以去除较小的轮廓,并以一半大小显示原始图像。相反,它会获取预期的图像并将其中 3 个压缩到同一空间中。

对于为什么会发生这种情况有任何猜测吗?


更新 1:

好的,因为看起来在右侧尺寸的图像上运行 findContours 仍然可以给我正确的输出,即可以将扭曲的 3 次复制的右侧图像的轮廓粘贴到正确的位置在左侧输入图像上,我决定只拍摄扭曲的图像并将其裁剪以用于显示目的。它只会用于在图像中查找给定 HSV 范围的轮廓,如果它能达到这个目的,我很高兴。

【问题讨论】:

大概;这与香奈儿的转换有关。在大多数情况下,这些事情发生在预期有 3 个通道时,但提供了一个(或相反)。尝试在结果之间打印。 确实,应该先把图片转成黑白吧,或许 中间的唯一步骤是 HSV 转换,这看起来和我预期的一样。它是 inRange 函数返回像那样分成 3 的帧。 另外,@Ashalynd 将其转换为黑白会删除我需要的所有颜色信息,你知道,用于识别颜色。 您能否发布您的 HSV 范围值。这样我们就不必在尝试重现您的问题时进行猜测。 【参考方案1】:

作为@Nallath cmets,这显然是一个渠道问题。根据文档,inRange() 的输出应该是 1 通道 CV_8U 图像,这是所有通道包含的逻辑 AND

您的结果意味着threshold 沿途某处被视为 3 通道平面顺序图像。

您使用的是什么版本的 OpenCV?

我建议您在每个步骤之间显示threshold 以找到发生这种转换的位置。这可能是一个错误,应该是reported。

【讨论】:

以上是关于OpenCV:HSV inRange 返回压缩并重复的二进制图像的主要内容,如果未能解决你的问题,请参考以下文章

使用`cv::inRange` (OpenCV) 为颜色检测选择正确的 HSV 上下边界

在 OpenCV (Java) 中获取正确的 HSV 颜色 inRange

[opencv]Scalarc类 常用颜色阈值总结

opencv 彩色图像分割(inrange)

opencv 颜色识别hsv方法 C++(红色)

Java opencv inRange 阈值函数使我的图像变成三个不同的图像?