为什么 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 以获得更详细的解释。
我刚刚开始学习 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 以获得更详细的解释。