如何将 HSV mask 转换为 BGR?
How do I convert HSV mask to 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 keeps 抛出一个关于掩码有一个通道这一事实的错误,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 转换,这将是三通道(即彩色)图像。此外,您不需要转换为 BGR . 只需检查一下,其中 tmpMask 为 255(“灰度颜色 space”中的白色)。 ~ @HansHirse
cv::cvtColor(tmpMask, yellowMask, cv::COLOR_GRAY2BGR) ;
对于我正在编写的这个颜色检测程序,我本质上是将图像转换为 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 keeps 抛出一个关于掩码有一个通道这一事实的错误,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 转换,这将是三通道(即彩色)图像。此外,您不需要转换为 BGR . 只需检查一下,其中 tmpMask 为 255(“灰度颜色 space”中的白色)。 ~ @HansHirse
cv::cvtColor(tmpMask, yellowMask, cv::COLOR_GRAY2BGR) ;