如何访问 CV_32F/CV_64F Mat 的像素值?
Posted
技术标签:
【中文标题】如何访问 CV_32F/CV_64F Mat 的像素值?【英文标题】:How to access pixel values of CV_32F/CV_64F Mat? 【发布时间】:2013-02-28 07:47:49 【问题描述】:我正在研究单应性,每当我尝试使用 H.at<float>(i, j)
检查 H 矩阵(类型 CV_64F)的值时,我都会得到随机数(有时是垃圾值)。我想访问浮点矩阵的像素值。有什么办法吗?
Mat A = Mat::eye(3, 3, CV_64F);
float B;
for(int i=0; i<A.rows; i++)
for(int j=0; j<A.cols; j++)
printf("%f\n", A.at<float>(i, j));
imshow("identity", A);
waitKey(0);
这显示了单位矩阵的正确图像,但是在尝试访问像素值时,我得到了
0.000000 1.875000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
为什么会这样?
【问题讨论】:
【参考方案1】:你应该试试这个:
A.at<double>(i, j);
因为您的矩阵是“类型”CV_64F
,这反过来意味着它包含类型为 double
的元素,而不是 float
。
顺便说一句,我不确定你是否知道这一点,但你可以使用cout
来打印矩阵,如下所示:
std::cout << A << std::endl;
我发现这对于检查小矩阵或矩阵切片很有用。
【讨论】:
【参考方案2】:下面的例子初始化了一个希尔伯特矩阵:
Mat H(100, 100, CV_64F);
for(int i = 0; i < H.rows; i++)
for(int j = 0; j < H.cols; j++)
H.at<double>(i,j)=1./(i+j+1);
请记住,at 运算符中使用的尺寸标识符不能随机选择。这取决于您尝试从中检索数据的图像。下表对此提供了更好的了解:
如果矩阵是 CV_8U 类型,则使用Mat.at<uchar>(y,x)
。
如果矩阵是 CV_8S 类型,则使用Mat.at<schar>(y,x)
。
如果矩阵是 CV_16U 类型,则使用Mat.at<ushort>(y,x)
。
如果矩阵是 CV_16S 类型,则使用 Mat.at<short>(y,x)
。
如果矩阵是 CV_32S 类型,则使用Mat.at<int>(y,x)
。
如果矩阵是 CV_32F 类型,则使用 Mat.at<float>(y,x)
。
如果矩阵是 CV_64F 类型,则使用 Mat.at<double>(y,x)
。
(取自OpenCV docs)
【讨论】:
以上是关于如何访问 CV_32F/CV_64F Mat 的像素值?的主要内容,如果未能解决你的问题,请参考以下文章
opencv 访问 CV_32FC3 BGR cv::Mat 的颜色元素
opencv的代码 Mat T =Mat(X.rows,X.cols,CV_64F); T.at<Vec3b>(0, 0)[0] = 1.0; 为啥这句话报错?