为什么HighGui.imshow() 函数无法正确处理 Mat 的数据类型 CV_32FC1(32位浮点数,单通道),该怎么解决
时间: 2024-10-20 15:10:58 浏览: 37
`highgui.imshow()`函数通常用于OpenCV中的图像显示,它主要用于处理8位灰度图像(CV_8UC1)或3通道彩色图像(如CV_8UC3)。对于高深度的数据类型,如32位浮点数单通道(CV_32FC1),该函数默认可能无法直接展示,因为这类图像的像素值范围可能超出0-255的整数值,而且imshow内部不是设计用来处理这种类型的图像。
要解决这个问题,你需要先将浮点型图像转换成适合imshow的格式,例如:
1. **转换为8位灰度图**:如果数据范围可以线性缩放到0-255,你可以使用`cv::convertScaleAbs()`函数将其归一化到0-255范围内,然后再显示:
```cpp
cv::Mat floatImage;
// ... load or generate your CV_32FC1 image here
cv::Mat ucharImage;
cv::convertScaleAbs(floatImage, ucharImage, 0, 255);
cv::imshow("Float Image", ucharImage);
```
2. **保存为图片文件**:另一种选择是将浮点型图像保存为支持的图片格式(如PNG、BMP等),然后查看:
```cpp
cv::imwrite("float_image.png", floatImage);
cv::imshow("Float Image", cv::imread("float_image.png"));
```
相关问题
/usr/bin/ld: warning: libopencv_highgui.so.3.4, needed by ../../../../lib/libORB_SLAM3.so, may conflict with libopencv_highgui.so.3.2
这是一个警告,意思是在编译链接时,发现你需要链接的 libORB_SLAM3.so 库需要用到 libopencv_highgui.so.3.4 库,但是系统中已经存在了版本较低的 libopencv_highgui.so.3.2 库,可能会有冲突。你需要检查你的系统中是否同时存在这两个库,并且需要确认你的程序是否能够正确链接到需要的库。可以使用 ldd 命令来查看程序所需要的库文件及其版本信息。如果有冲突,可以考虑升级或降级相关的库文件,或者使用软链接来解决冲突。
import cv2 import numpy as np import torch from skimage.segmentation import slic from skimage.util import img_as_float # 读取A图像和B图像 img_a = cv2.imread(r'D:\Users\Administrator\PycharmProjects\pythonProject\my tools\super_pixel\1.png') img_b = cv2.imread(r'D:\Users\Administrator\PycharmProjects\pythonProject\my tools\super_pixel\2.jpg') # 转换为浮点数 img_a = img_as_float(img_a) img_b = img_as_float(img_b) # 使用SLIC算法进行超像素分割 segments_a = slic(img_a, n_segments=1000, compactness=10) segments_b = slic(img_b, n_segments=1000, compactness=10) # 计算A图像的超像素范围 segment_ids = np.unique(segments_a) segment_ranges = [] for segment_id in segment_ids: y, x = np.where(segments_a == segment_id) min_x, max_x = np.min(x), np.max(x) min_y, max_y = np.min(y), np.max(y) segment_ranges.append((min_x, min_y, max_x, max_y)) # 创建A图像的超像素范围图 segment_map_a = np.zeros_like(segments_a, dtype=np.int32) for i, segment_range in enumerate(segment_ranges): min_x, min_y, max_x, max_y = segment_range segment_map_a[min_y:max_y+1, min_x:max_x+1] = i # 使用A图像的超像素范围索引对B图像进行分割 segment_map_b = np.zeros_like(segments_b, dtype=np.int32) for i, segment_range in enumerate(segment_ranges): min_x, min_y, max_x, max_y = segment_range segment_id = segments_a[min_y, min_x] y, x = np.where(segments_b == segment_id) segment_map_b[y, x] = i # 转换为PyTorch张量 segment_map_b = torch.Tensor(segment_map_b).long() # 显示B图像的超像素范围图 cv2.imshow('Segment Map', segment_map_b.numpy()) cv2.waitKey(0) cv2.destroyAllWindows()。上述代码出现错误: cv2.imshow('Segment Map', segment_map_b.numpy()) cv2.error: OpenCV(4.7.0) D:/a/opencv-python/opencv-python/opencv/modules/highgui/src/precomp.hpp:155: error: (-215:Assertion failed) src_depth != CV_16F && src_depth != CV_32S in function 'convertToShow'
这个错误是因为在使用cv2.imshow()函数时,需要传入的图像是8位无符号整数类型,而segment_map_b是一个PyTorch张量,需要将其转换为NumPy数组并将其数据类型转换为np.uint8类型。你可以使用以下代码将张量转换为NumPy数组并将其数据类型转换为np.uint8类型:
```
cv2.imshow('Segment Map', segment_map_b.numpy().astype(np.uint8))
```
阅读全文