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

时间:2014-05-26 14:55:04

标签: c++ opencv computer-vision object-recognition

我在转换颜色识别图像方面遇到了一些麻烦。

该功能如下所示:

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);

}

输出如下:

Input on the left, output on the right, filtering to find the yellow ball

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

任何猜测为什么会发生这种情况?


更新1:

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

1 个答案:

答案 0 :(得分:0)

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

您的结果意味着threshold的某个地方被视为3通道平面图像。

您使用的是哪个版本的OpenCV?

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