2016-11-28 183 views
1

描述問題可能比描述問題要容易得多。我用下面的代碼兩行C++使用的OpenCV:如何在使用OpenCV cv :: Mat.at函數時使用正確的類型名稱

std::cout << "value near i,j: " << myMat(Rect(i,j,2,2)) << std::endl; 
std::cout << "value at i,j: " << myMat.at<double>(i,j) << std::endl; 

我得到如下結果:

value near i,j: [34, 42; 
    39, 44] 
value at i,j: 24 

我相信,在第一個值(24)和值的第一個數字第二行(34)應該相等。 myMat中的數據類型現在應該定義爲CV_64F。我的結論是,當我從OpenCV數據類型轉換爲C++基元類型時,我做錯了什麼,因爲當我最初使用CV_16S時,我的值更差。那麼我需要做什麼樣的修正才能正確訪問cv :: Mat構造中的值?

P.S:myMat創建並分配如下:

Mat yourMat, myMat; 
[... yourMat is assigned ...] 
Sobel(yourMat, myMat, CV_64F, 1, 0, 3, 1, 0, BORDER_DEFAULT); 

P.S.2:我發現了一個類似的問題here但答案似乎是隻分配一個變通。

回答

1

你應該在第二線切換i,jmyMat.at<double>(j,i)


myMat(Rect(i,j,2,2))您使用的Rect構造:

x, y, width, height 

所以你Rect左上方是(x,y) = (i, j)。然而,當你與.at訪問值你.at<Tp>(row, col)訪問它,這是(x,y)逆,因爲row = ycol = x

所以你有效地閱讀在(y, x) = (j, i)位置的值。


CV_16U類型的矩陣工作,你需要訪問使用.at<Tp>它:

  • CV_16UC1m.at<ushort>
  • CV_16UC2m.at<Vec2w>
  • CV_16UC3m.at<Vec3w>
  • CV_16UC4m.at<Vec4w>

或者你可以使用:

  • Mat1w
  • Mat2w
  • Mat3w
  • Mat4w

,沒有.at訪問矩陣,只是用括號:m(r,c)

+0

優秀點。我知道Mat.at和Rect的兩個不同的參數順序,但似乎我沒有設法將它們綁定在一起。事實證明,我的推論,這是一個類型問題(在這種情況下)是錯誤的,你的答案解決了我的問題。只是爲了與主題相匹配,如果有人會關注問題的類型匹配部分:如果CV數據類型是CV_16S,我們將如何使用Mat.at命令?因爲那麼'myMat.at (j,i)','myMat.at (j,i)'或'myMat.at (j,i)'仍然會給出錯誤的結果。 – hekimgil

+0

查看更新的答案 – Miki

+0

謝謝,很棒的工作。並且在你的指導下,我還發現了[這個有用的鏈接](http://ninghang.blogspot.com.tr/2012/11/list-of-mat-type-in​​-opencv.html)和一個完整的Mat列表OpenCV中的類型及其對應的C++類型。 – hekimgil

相關問題