c++ 将cv::Mat的元素替换为at< float>(i,j),是(x,y)还是(row,col)?

rkttyhzu  于 2023-11-19  发布在  其他
关注(0)|答案(5)|浏览(120)

当我们访问cv::Mat结构中的特定元素时,我们可以使用mat.at<float>(i,j)访问位置i, j处的元素。但是,i, j是指矩阵中的x, y坐标,还是指第i行第j列,目前还不清楚。

gkn4icbw

gkn4icbw1#

OpenCV,像许多其他库一样,以行优先的顺序处理矩阵访问。这意味着每个访问都定义为(row, column)。请注意,如果您使用图像的x和y坐标,则这将成为(y, x),如果y是您的垂直轴。
大多数矩阵库在这方面是相同的,例如,在Matlab或Eigen(C++矩阵库)中访问也是(row, col)
然而,这些应用程序和库的不同之处在于数据实际上是如何在内存中存储的。(即行优先),而例如Matlab将数据以列为主的顺序存储在内存中。但如果您只是这些库的用户,并且通过(row, col)访问器访问数据,你永远不会看到内存存储顺序的差异。

ubof19bj

ubof19bj2#

所以OpenCV处理这个有点奇怪。OpenCV以行优先顺序存储Mat,但是通过方法Mat::at()错误地建议列优先顺序。我认为OpenCV文档在这种情况下是误导的。我不得不写这个测试用例来确保自己。

cv::Mat m(3,3,CV_32FC1,0.0f);
m.at<float>(1,0) = 2;
cout << m << endl;

字符串
所以寻址是通过Mat::at(y,x)完成的:
[0,0,0;
2,0,0;
0,0,0]
但是原始指针访问揭示了它实际上是以行为主存储的,例如,“2”在第4个位置。如果它以列为主存储,它将在第2个位置。

float* mp = &m.at<float>(0);
for(int i=0;i<9;i++)
    cout << mp[i] << " ";

0 0 0 2 0 0 0 0
顺便说一句:Matlab以列主顺序存储和寻址矩阵。这可能很烦人,但至少它是一致的。

y0u0uwnf

y0u0uwnf3#

OpenCV,像其他库一样,以行优先的顺序处理矩阵(和图像)。这意味着每次访问都定义为(row, column)
这条一般规则的显著例外是Matlab和Eigen库。

ipakzgxi

ipakzgxi4#

根据我在文档中所读到的,它是at(y, x)(即row, col)。

arknldoa

arknldoa5#

由于cv::Mat实际上是一个一般矩阵,图像只是一个特殊情况,它遵循矩阵索引,因此行(y)位于列(x)之前:

mat.at(i, j) = mat.at(row, col) = mat.at(y, x)

字符串

相关问题