如何访问CV_32F/CV_64F Mat的像素值



我正在研究单应性,每当我尝试使用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("%fn", A.at<float>(i, j));
    }
}
imshow("identity", A);
waitKey(0);

这显示了单位矩阵的正确图像,但当试图访问像素值时,我得到

0.0000001.8750000.0000000.0000000.0000000.0000000.0000000.0000000.000000

为什么会这样?

你应该试试这个:

A.at<double>(i, j);

因为您的矩阵是"类型"CV_64F,这反过来意味着它包含类型为double的元素,而不是float

顺便说一下,我不确定你是否意识到这一点,但你可以使用cout来打印矩阵,如下所示:

std::cout << A << std::endl;

我发现这对于检查一个小矩阵或矩阵的一个切片很有用。

下面的例子初始化了一个Hilbert矩阵:

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文档)

相关内容

  • 没有找到相关文章

最新更新