13

我正在研究单应性,每当我尝试使用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

为什么会这样?

4

2 回答 2

24

你应该试试这个:

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

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

顺便说一句,我不确定您是否知道这一点,但您可以使用cout如下方式打印矩阵:

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

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

于 2013-02-28T07:53:02.343 回答
23

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

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

于 2017-04-04T18:25:04.493 回答