2012-10-08 155 views
8

如果我有矩陣的類型CV_32SC1,哪個typename shuld我使用函數Mat :: at?訪問opencv矩陣CV_32S元素

例如

Mat X; // for example eye matrix of size 10,10,and type CV_32SC1 
X.at<??????>(1,1)=5; 
  • 我如何才能找到其他矩陣類型的類型名稱?

回答

15

爲矩陣typenames OpenCV中的一般規則是:

CV_<bit_depth>(S|U|F)C<number_of_channels> 

S = Signed integer 
U = Unsigned integer 
F = Float 

所以這取決於前面的字母(S,U,F)你,你會被鑄造<int><unsigned integer><float>之一。

+0

請實際[請閱讀](http://stackoverflow.com/review-beta/suggested-edits/780994)您點擊批准的評論 –

+1

在這種情況下,我寧願,因爲C++標準沒有指定整型類型的位長度 –

+0

沒有CV_32U *類型,但是如果你的CV_32SC1數組實際上包含無符號值,你仍然可以使用'X.at (i,j)'。 – greggo

3

CV_32SC1是1個有符號的32位整數通道,那麼我認爲X.at<int>()應該這樣做。

Mat已經'知道'如何處理一個像素,該類型只是將這些位轉換爲表達式求值所需的C++值。

我找到here關於符號的一些解釋。

+0

不完全正確。在''處,x方向上的尋址完全基於T的大小。如果你的矩陣是CV_8UC3,那麼'X.at (0,2)'會得到你第一行的第三個像素;但是'X.at (0,2 * 3 + 1)'會給你同一像素的第二個通道(即與'X.at (0,2)[1]' 相同的字節。因此,x方向上的音高基於編譯時常量'sizeof(T)',而不是根據存儲在Mat對象中的類型計算出的值,這使得性能有很大的差異,它還支持'平面'視圖 – greggo