我想在opencv中匹配一个特定的RGB颜色,并在匹配的地方生成一个蒙版。我尝试使用compare()
,但它在三个通道上独立运行。下面是我的测试程序,我希望它能匹配绿色(00ff00),但它根本不能。
cv::Mat testImg = cv::imread("test.png", cv::IMREAD_COLOR);
cv::Mat mask(testImg.size().height, testImg.size().width, CV_8U, cv::Scalar(0));
cv::compare(testImg, cv::Vec3b(0x00, 0xff, 0x00), mask, cv::CMP_EQ);
imwrite("out.png", mask);
字符串
例如,对于下面的输入,我期望代码与第一行中的绿色方块匹配:
的数据
但是输出显示它在逐个通道的基础上匹配0(忽略0xff),所以遮罩最终使用反转的颜色(不是布尔值),这根本不是我想要的:
的
我可以split
通道,运行compare
三次,并合并结果,但我希望有一个更好的方法。我可以将3通道图像转换为一个24位通道并一次比较所有24位吗?我应该使用inRange
吗?
1条答案
按热度按时间a7qyws3x1#
您可以使用
cv::inRange
沿着每个颜色的HSV
值来创建您要查找的颜色的二进制掩码。一个选项是创建一个颜色名称为string
的std::map< std::string, std::vector<cv::Scalar> >
和一个低阈值和高阈值的std::vector
。迭代Map并创建掩码。类似于以下内容(对于红色,绿色和蓝色):字符串
对于蓝色,你得到这个二进制掩码:
的数据
如果你
AND
这个遮罩和原始输入图像,你会得到这个:的