我刚刚学习OpenCV,因为我对Matlab的逻辑索引有一些经验,所以我真的很想看到矩阵方法setTo。我最初的尝试不起作用,我无法弄明白为什么,所以我非常感谢你的帮助!
我有一个包含图像数据的Mat,并希望将大于10的所有值设置为零。所以,我做了:
Mat not_relevant = abs(difference - frame2) > 10;
difference = difference.setTo(0, not_relevant);
然而,这给了我:
OpenCV Error: Assertion failed (mask.empty() || mask.type() == CV_8U) in
cv::Mat::setTo, file
C:\builds\2_4_PackSlave-win32-vc12-shared\opencv\modules\core\src\copy.cpp, line 347
我尝试在使用之前转换not_relevant,difference和frame2,例如:
frame2.convertTo(frame2, CV_8UC1);
但是这并没有解决错误,所以我不确定我还能尝试什么。有谁知道可能出现什么问题?
感谢您的帮助!
答案 0 :(得分:1)
我认为错误非常清楚。掩码图片的类型应为CV_8U
。
因此您需要将not_relevent
转换为灰度。
Mat not_relevant = abs(difference - frame2) > 10;
cv::cvtColor(not_relevant, not_relevant, CV_BGR2GRAY);
difference = difference.setTo(0, not_relevant);
为什么convertTo在这里不起作用?
CV_8U
(或CV_8UC1
)是具有一个 uchar值通道的图片类型。
convertTo
无法更改图片中的频道数量。
因此,使用CV_8U
将具有多个频道的图片转换为convertTo
不起作用。
请查看this answer以获取更详细的说明。