OpenCV imshow显示CV_32SC1类型Mat报convertToShow断言失败问题
问题场景
使用OpenCV处理相机输出的有符号32位整型图像数据时,需要将原始数据转为OpenCV的Mat对象后调用imshow完成显示:
- 此前处理16位有符号整型数据时,以下代码可以正常运行:
int16_t x[100][100]; Mat A(100, 100, CV_16SC1, x); imshow("BLAH", A);
- 按照相同的类型匹配逻辑:
- 8位无符号整型数据用
uint8_t搭配CV_8UC1 - 双精度浮点数据用
double搭配CV_64FC1
这两种类型都可以正常调用imshow显示。
- 8位无符号整型数据用
- 但处理
int32_t类型数据时,使用如下代码:
int32_t x[100][100]; Mat A(100, 100, CV_32SC1, x); imshow("BLAH", A);
OpenCV执行到imshow语句时抛出-215:Assertion failed异常,错误提示为src_depth != CV_16F && src_depth != CV_32S in function 'convertToShow',即使用int替换int32_t定义数据数组,问题仍然无法解决。
报错原因
这是OpenCV imshow接口本身的格式限制,和原始数据的类型定义无关。imshow原生支持的输入Mat深度只有CV_8U、CV_8S、CV_16U、CV_16S、CV_32F、CV_64F,明确不支持CV_32S(32位有符号整型)和CV_16F(16位半精度浮点数),你看到的断言就是接口做输入格式校验时主动抛出的。
之前能正常运行的CV_16SC1、CV_8UC1、CV_64FC1都在支持列表里,唯独32位有符号整型不在支持范围内,所以不管你用int32_t还是int定义数组,只要Mat的深度标记为CV_32S就会触发报错。
解决方法
在调用imshow前,将CV_32S格式的Mat转换为接口支持的格式即可,根据相机输出数据的实际取值范围选择对应方案:
- 若数据取值固定在0~255区间:直接转换为8位无符号单通道格式
Mat disp_mat; A.convertTo(disp_mat, CV_8UC1); imshow("BLAH", disp_mat);
- 若数据取值在0~65535区间,需要保留更高的灰度精度:转换为16位无符号单通道格式
Mat disp_mat; A.convertTo(disp_mat, CV_16UC1); imshow("BLAH", disp_mat);
- 若数据取值范围不确定、包含负数、或者数值跨度较大:使用归一化方案(通用适配所有场景)
Mat disp_mat; // 将数据线性拉伸到0~255标准灰度区间,自动适配原始数据的最大最小值,转换为8位无符号格式显示 normalize(A, disp_mat, 0, 255, NORM_MINMAX, CV_8UC1); imshow("BLAH", disp_mat);
注意:如果原始32位数据中存在负数值,不要直接使用前两种强制类型转换方案,负数会被截断为0,导致显示图像出现大面积黑块、内容失真。
内容的提问来源于stack exchange,提问作者RPM
相关产品推荐
相关产品推荐

