2016-07-05 6 views
1

Gegeben opencv::Mat m1,m2, ich möchte überprüfen, ob m1[i][j] und m2[i][j] gleich sind.Unterschied zwischen at() und row(). Col()

Ich habe gesehen, dass es zwei Möglichkeiten, dies zu tun:

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

und:

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

Beachten Sie, dass beide m1 und m2 Matrix SIFT-Deskriptoren sind (so ist float der Elementtyp).

Meine Frage ist: Was ist der Unterschied zwischen den beiden Zugriffsmethoden?

Antwort

2

Obwohl das Nettoergebnis der beiden Operationen die gleiche ist, ist die erste, teurer:

  • m1.row(i) eine repräsentiere Reihe Mat Objekt erstellt i, dann
  • col(j) aufgerufen wird die Mat von zurück m1.row(i), um ein Einzelelement Mat zu erhalten, das Objekt bei (i, j) darstellt
  • Die gleiche Abfolge von Operationen gilt für m2
  • Die beiden Mat Objekte verglichen werden mit ==
  • Vier temporäre Objekte deallokierten

Im Gegensatz zu bekommen, gibt m1.at<float>(i,j) einfach eine float, die dann mit dem anderen Schwimmer verglichen wird, ohne zusätzliche Objekte zu schaffen.

+0

Aber die erste Lösung hat den Vorteil, dass wir den Typ "Mat" zur Kompilierzeit nicht kennen müssen. Ist das korrekt? – justHelloWorld

+0

@justHelloWorld Das ist richtig, der zu vergleichende Objekttyp ist 'Mat', so dass Sie ihn zur Kompilierzeit nicht explizit angeben müssen. – dasblinkenlight

Verwandte Themen