2

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

该函数如下所示:

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 次复制的右侧图像的轮廓粘贴到左侧的右侧位置-side 输入图像,我决定只拍摄扭曲的图像并将其裁剪以用于显示目的。它只会用于在图像中查找给定 HSV 范围的轮廓,如果它可以达到这个目的,我很高兴。

4

1 回答 1

-1

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

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

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

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

于 2014-06-12T06:27:00.167 回答