0

对于我正在编写的这个颜色检测程序,我基本上将图像转换为 HSV 并对其进行遮罩以检测黄色(黄色为白色,否则为黑色)然后简单地查看给定像素是否为白色。

    const cv::Mat roiImage = // read in image ... ;

    cv::Mat tmpMask ;
    cv::cvtColor(roiImage, tmpMask, cv::COLOR_BGR2HSV) ;
    cv::inRange(tmpMask, cv::Scalar(20, 100, 100), cv::Scalar(30, 255, 255), tmpMask) ;

问题是,要查看给定像素的值是否为白色,我尝试将其转换回 BGR,但 opencv 不断抛出一个错误,因为掩码有一个通道,BGR 有 3 个(我不需要解释为什么会这样,问题在下面)

    cv::Mat yellowMask ; cv::cvtColor(tmpMask, yellowMask, cv::COLOR_HSV2BGR) ;
                                               // ^ error here
terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(4.2.0) ../modules/imgproc/src/color.simd_helpers.hpp:92: error: (-2:Unspecified error) in function 'cv::impl::{anonymous}::CvtHelper<VScn, VDcn, VDepth, sizePolicy>::CvtHelper(cv::InputArray, cv::OutputArray, int) [with VScn = cv::impl::{anonymous}::Set<3>; VDcn = cv::impl::{anonymous}::Set<3, 4>; VDepth = cv::impl::{anonymous}::Set<0, 5>; cv::impl::{anonymous}::SizePolicy sizePolicy = cv::impl::<unnamed>::NONE; cv::InputArray = const cv::_InputArray&; cv::OutputArray = const cv::_OutputArray&]'
> Invalid number of channels in input image:
>     'VScn::contains(scn)'
> where
>     'scn' is 1

我发现的唯一解决方法是在外部编写掩码(即,将其保存为图像)然后将其读入,然后就可以了,但是效率极低。

如何找到解决此问题的方法?谢谢你的时间

(ps。对于上下文,黄色是一种很难检测的颜色。我使用距离来查看像素是否最接近 BGR 橙色、黑色、蓝色、白色或灰色。如果像素是橙色,我会检查相应的像素是否在蒙版被检测为黄色。如果像素是白色的,我说它是黄色的,否则它实际上是橙色的。系统运行良好,我只是不想在外部保存它)

4

1 回答 1

0

“您的 tmpMask 是单通道(即灰度)图像,因此您无法从 HSV 转换,这将是三通道(即彩色)图像。此外,您不需要转换为 BGR。只需检查,在哪里tmpMask 为 255(“灰度色彩空间”中的白色)。” 〜@HansHirse

cv::cvtColor(tmpMask, yellowMask, cv::COLOR_GRAY2BGR) ;

于 2022-01-03T11:36:54.263 回答