OpenCV中ConvertTo转换为Float类型触发断言错误问题咨询
解决OpenCV中3通道图像转
cv::Mat_<float>的断言错误 嘿,这个问题我之前也踩过坑!核心原因其实很直白:cv::Mat_<float>是固定单通道的浮点矩阵类型,而你读入的彩色图像是3通道的(不管是默认imread还是指定CV_LOAD_IMAGE_COLOR,都是BGR三通道格式)。当你调用convertTo时,OpenCV会严格校验目标矩阵的通道数和类型是否匹配,这就触发了断言失败的报错。
给你两种可行的解决方案,按需选择:
方案1:保留3通道,用普通cv::Mat接收
如果你需要保留图像的彩色信息,那就别用Mat_<float>,直接用普通的cv::Mat来接收转换结果——它支持任意通道数:
cv::Mat temp = cv::imread(filename.c_str()); cv::Mat temp2; temp.convertTo(temp2, CV_32F); // 这样3通道会完整转换成3通道的float矩阵,完全没问题
方案2:转灰度单通道后再用Mat_<float>
如果你的场景只需要单通道数据,先把彩色图转成灰度图,再转换为Mat_<float>就不会报错了:
cv::Mat temp = cv::imread(filename.c_str()); cv::Mat gray_temp; cv::cvtColor(temp, gray_temp, cv::COLOR_BGR2GRAY); // 先转成单通道灰度图 cv::Mat_<float> temp2; gray_temp.convertTo(temp2, CV_32F); // 现在通道数和类型都匹配,断言不会触发
额外补充
cv::Mat_<T>是cv::Mat的模板子类,它的特点就是强制矩阵为单通道且元素类型是T,适合明确知道是单通道的场景;而普通cv::Mat更灵活,能处理多通道图像,所以处理彩色图时用它就对啦。
内容的提问来源于stack exchange,提问作者J.Alex
相关产品推荐
相关产品推荐

