在OpenCV中对CV_32F图像使用setTo触发断言失败的问题
问题原因与解决
文档没有错误,setTo要求mask为CV_8U类型是对的,但你触发断言失败的核心问题是mask的通道数不匹配:
- 若你的V1、V2是多通道(如3通道)CV_32F图像,
cv::abs(V1-V2)生成的V也是同通道数的图像,执行V < epsilon后得到的mask会和V通道数一致(比如3通道CV_8U),但setTo要求mask必须是单通道的CV_8U,这才导致了断言失败。
解决办法
你需要将多通道mask转换为单通道,以下是两种常用方案:
- 合并多通道mask为单通道:
float epsilon = 0.05f; cv::Mat V = cv::abs(V1 - V2); cv::Mat mask; cv::compare(V, epsilon, mask, cv::CMP_LT); // 显式调用compare,逻辑更清晰 cv::Mat single_mask; cv::bitwise_or(mask, cv::noArray(), single_mask); // 多通道按位或合并为单通道 V1.setTo(V2, single_mask);
- 直接生成单通道mask(以所有通道差值都小于epsilon为例):
float epsilon = 0.05f; cv::Mat diff = cv::abs(V1 - V2); // 将多通道展开为单通道,判断每个元素是否小于epsilon,再按行合并为单通道 cv::Mat mask = (diff.reshape(1) < epsilon).reshape(0, diff.rows); cv::reduce(mask, mask, 1, cv::REDUCE_ALL); // 行内所有元素都满足则为非0 mask.convertTo(mask, CV_8U); V1.setTo(V2, mask);
内容的提问来源于stack exchange,提问作者galinette
相关产品推荐
相关产品推荐

