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

Why does setTo not work (assertion failed)?

我刚刚开始学习 OpenCV,并且由于我对 Matlab 的逻辑索引有一些经验,所以我对矩阵方法 setTo 非常感兴趣。虽然我最初的尝试没有成功,但我也不知道为什么,所以非常感谢您的帮助!

我有一个包含图像数据的垫子,我想将所有大于 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_4_PackSlave-win32-vc12-shared\opencv\modules\core\src\copy.cpp, line 347

我在使用之前尝试转换 not_relevant、difference 和 frame2,例如:

frame2.convertTo(frame2, CV_8UC1);

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

感谢您的帮助!

我认为你的蒙版图像错误 clear.type 应该是 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 无法更改图像中的通道数。

因此使用 convertTo 将具有多个通道的图像转换为 CV_8U 是行不通的。 查看 this answer 以获得更详细的解释。