为什么setTo不起作用(断言失败)?

时间:2015-01-16 13:32:51

标签: c++ opencv

我刚刚学习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);

但是这并没有解决错误,所以我不确定我还能尝试什么。有谁知道可能出现什么问题?

感谢您的帮助!

1 个答案:

答案 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以获取更详细的说明。