如何在 Opencv 中显示一个 Mat

Posted

技术标签:

【中文标题】如何在 Opencv 中显示一个 Mat【英文标题】:how to display a Mat in Opencv 【发布时间】:2014-07-31 23:40:52 【问题描述】:

对于存储图像的mat,使用imshow很容易显示。但是如果Mat的数据类型是CV_32FC1,如何显示这个mat?

我试过imshow,但显示的数字是全白的,当我放大int时,它仍然是全白的,我看不到mat中的浮点数。

有没有人知道如何显示整个 mat 矩阵?

ps:谢谢回复。我将发布一些代码和数字以显示更多详细信息: 代码:

Mat mat1;
mat1 = Mat::ones(3,4,CV_32FC1);
mat1 = mat1 * 200;
imshow("test", mat1);
waitKey(0);

Mat dst;
normalize(mat1, dst, 0, 1, NORM_MINMAX);
imshow("test1", dst);
waitKey(0);

mat1.convertTo(dst, CV_8UC1);
imshow("test2", dst);
waitKey(0);

return 0;

输出:

放大 150% 后:

然后我放大 150% 后,我们可以看到“测试”是全白的,我们看不到它的元素值。 'test1' 完全是黑色的,我们仍然看不到它的元素值。但是对于'test2',它是灰色的,我们可以看到它的元素值是200。

这个实验是否意味着imshow()只能显示CV_8UC1而我们不能显示任何其他数据类型?

【问题讨论】:

【参考方案1】:

如果image是CV_32F类型的Mat,如果图像是32位浮点,imshow()将像素值乘以255——即取值范围[0,1]映射到[ 0,255]。 所以你的浮点图像的范围必须是 0 .. 1。

这将显示一个 CV32F 图像,无论范围是多少:

        cv::Mat dst
        cv::normalize(image, dst, 0, 1, cv::NORM_MINMAX);
        cv::imshow("test", dst);
        cv::waitKey(0);

【讨论】:

只是想知道为什么投反对票:这种方式非常适合我。 我也想知道为什么投反对票。在 [0:1] 中标准化您的浮动图像并调用 imshow 是完全有效的。为我 +1

以上是关于如何在 Opencv 中显示一个 Mat的主要内容,如果未能解决你的问题,请参考以下文章

opencv编程中cvMat到Mat如何进行数据转换?

opencv中,新建一个Mat变量,但是只是赋值了其数据,不知道其宽高,请问如何正确显示?

如何在opencv中交换Mat行?

如何在 Python 中使用 OpenCV 创建 Mat 矩阵?

如何在矩形子区域中划分 OpenCV Mat?

OpenCV / C++ - 如何在向量上使用adaptiveThreshold而不是Mat?