簡體   English   中英

使用at訪問cv :: Mat的元素 <float> (i,j)。 是(x,y)還是(row,col)?

[英]Accessing elements of a cv::Mat with at<float>(i, j). Is it (x,y) or (row,col)?

當我們訪問cv :: Mat結構的特定元素時,我們可以使用mat.at(i,j)來訪問位置i,j的元素。 然而,不能立即清楚的是,(i,j)是指矩陣中的x,y坐標,還是第i行和第j列。

與許多其他庫一樣,OpenCV以行主順序處理矩陣訪問 這意味着每個訪問都定義為(row, column) 請注意,如果您正在處理圖像的x和y坐標,則如果y是垂直軸,則變為(y, x)

大多數矩陣庫在這方面是相同的,訪問是(row, col)以及例如Matlab或Eigen(C ++矩陣庫)。

然而,這些應用程序和庫的不同之處在於數據實際存儲在內存中的方式。 OpenCV以行 - 主要順序將數據存儲在內存中(即行首先出現),而例如Matlab將數據按列主要順序存儲在內存中。 但是如果你只是這些庫的用戶,並通過(row, col)訪問器訪問數據,你將永遠不會真正看到內存存儲順序的這種差異。

所以OpenCV處理這個有點奇怪。 OpenCV按行主要順序存儲Mat,但是通過matood 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 0

作為旁注:Matlab以列主要順序存儲和尋址矩陣。 這可能很煩人,但至少它是一致的。

與其他庫一樣,OpenCV可以按行主順序處理矩陣(和圖像)。 這意味着每個訪問都定義為(row, column)

這個一般規則的顯着例外是Matlab和Eigen庫。

根據我在文檔中看到的內容,它at(y, x) (即row, col )。

由於cv::Mat實際上是一個通用矩陣,圖像只是一種特殊情況,它遵循矩陣索引,因此行( y )位於列( x )之前:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM