我正在研究单应性,每当我尝试使用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
为什么会这样?
答案 0 :(得分:21)
你应该试试这个:
A.at<double>(i, j);
因为您的矩阵属于“类型”CV_64F
,这反过来意味着它包含double
类型的元素,而不是float
。
顺便说一句,我不确定您是否知道这一点,但您可以使用cout
打印矩阵,如下所示:
std::cout << A << std::endl;
我发现这对于检查小矩阵或矩阵切片很有用。
答案 1 :(得分:11)
以下示例初始化希尔伯特矩阵:
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)