opencv的代码 Mat T =Mat(X.rows,X.cols,CV_64F); T.at<Vec3b>(0, 0)[0] = 1.0; 为啥这句话报错?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv的代码 Mat T =Mat(X.rows,X.cols,CV_64F); T.at<Vec3b>(0, 0)[0] = 1.0; 为啥这句话报错?相关的知识,希望对你有一定的参考价值。

参考技术A 因为你的 T是单通道(CV_64F)的,而你在获取像素的点时候是用的三通道(Vec3b)的方式。

如何在 Opencv 中显示一个 Mat

【中文标题】如何在 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 T =Mat(X.rows,X.cols,CV_64F); T.at<Vec3b>(0, 0)[0] = 1.0; 为啥这句话报错?的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV InputArray和OutputArray

OpenCV InputArray和OutputArray

LIBTIFF 16位灰度tif图像转成OpenCV中的Mat格式并显示

如何在 Opencv 中显示一个 Mat

OpenCV如何处理Mat作为指针来加速代码?

opencv 中的 Mat_<unsigned char> - Mat 数据类型