gpt4 book ai didi

c++ - OpenCV:HSV inRange 返回压缩和重复的二值图像

转载 作者:太空狗 更新时间:2023-10-29 23:16:27 25 4
gpt4 key购买 nike

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

函数如下所示:

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,在给定阈值之间过滤以找到黄色球,腐 eclipse 和膨胀以去除较小的轮廓,并以一半大小显示原始图像。相反,它获取预期的图像并将其中的 3 个图像压缩在同一空间中。

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


更新 1:

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

最佳答案

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

您的结果意味着 threshold 沿途的某个地方被视为 3 channel 平面顺序图像。

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

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

关于c++ - OpenCV:HSV inRange 返回压缩和重复的二值图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23872851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com