如何将HSV掩码转换为BGR



对于我正在编写的这个颜色检测程序,我基本上将图像转换为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橙色、黑色、蓝色、白色或灰色。如果像素是橙色,我会检查掩码中相应的像素是否被检测为黄色。如果像素为白色,我会说它是黄色,否则它实际上是橙色。系统运行良好,我只想不必从外部保存它(

"你的tmpMask是一个单通道(即灰度(图像,所以你不能从HSV转换,HSV是一个三通道(即彩色(图像。此外,您不需要转换为BGR。简单地检查,其中tmpMask是255("灰度颜色空间"中的白色(&&quot;~@HansHirse

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

相关内容

  • 没有找到相关文章

最新更新