2016-07-05 58 views
1

鑑於opencv::Mat m1,m2,我想檢查m1[i][j]m2[i][j]是否相等。at()和row()。col()之間的區別

我已經看到有兩種方法可以做到這一點:

if(m1.row(i).col(j) == m2.row(i).col(j)) 

和:

if(m1.at<float>(i,j)==m2.at<float>(i,j)) 

注意兩個m1m2是SIFT矩陣描述符(所以float是元素類型)。

我的問題是:兩種訪問方法有什麼區別?

回答

2

雖然兩個操作的最終結果是一樣的,第一個是更昂貴:

  • m1.row(i)創建Mat對象代表一行i,然後
  • col(j)上被調用返回的Matm1.row(i)以獲得代表對象的單元素Mat(i, j)
  • 將相同的操作序列應用於m2
  • 兩個Mat對象進行比較與==
  • 四個臨時對象得到解除了分配

相比之下,m1.at<float>(i,j)簡單地返回一個float,然後把它相比於其他浮動,不會造成任何額外的對象。

+0

但是第一種解決方案的優點是我們不需要在編譯時知道'Mat'類型。那是對的嗎? – justHelloWorld

+0

@justHelloWorld這是正確的,被比較的對象類型是「Mat」,所以你不需要在編譯時顯式聲明它。 – dasblinkenlight