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

14
我正在处理单应矩阵,但每当我尝试使用 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);

这显示了单位矩阵的正确图像,但是当尝试访问像素值时,我得到了以下结果。为什么会这样?
2个回答

24

你应该尝试这个:

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

因为您的矩阵是“类型”为CV_64F,这意味着它包含的元素类型为double,而不是float
顺便提一下,我不确定您是否知道,您可以使用cout打印矩阵,如下所示:
std::cout << A << std::endl;

我觉得这对于检查小矩阵或矩阵的一部分非常有用。

24

下面的示例初始化了一个希尔伯特矩阵:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接