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; 为啥这句话报错?的主要内容,如果未能解决你的问题,请参考以下文章