2016-11-28 1 views
1

Es wird wahrscheinlich viel einfacher sein, die Situation zu beschreiben, als das Problem zu beschreiben. Ich verwende die folgenden zwei Zeilen Code in C++ OpenCV mit:So verwenden Sie den korrekten Typnamen bei Verwendung von OpenCV cv :: Mat.at Funktion

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; 

Und ich bekomme die folgenden Ergebnisse:

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

ich die erste Zahl in dem ersten Wert glaube (24) und der Wert in die zweite Linie (34) sollte gleich sein. Der Datentyp in myMat sollte derzeit als CV_64F definiert sein. Meine Schlussfolgerung ist, dass ich etwas falsch mache, wenn ich von den OpenCV-Datentypen in C++ - Grundtypen umwandele, weil ich viel schlechtere Werte hatte, als ich anfänglich CV_16S verwendete. Welche Art von Korrektur muss ich vornehmen, um den Wert in der cv :: Mat-Konstruktion korrekt zu erhalten?

P. S: myMat erstellt und wie folgt zugeordnet:

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

P.S.2: Ich habe eine ähnliche Frage here gefunden, aber die Antwort scheint es bei der Zuordnung nur eine Behelfslösung zu sein.

Antwort

1

Sie sollten i,j in zweiter Linie wechseln: myMat.at<double>(j,i)


In myMat(Rect(i,j,2,2)) Sie zum Rect Konstruktor:

x, y, width, height 

so die oben links auf Ihrem Rect in (x,y) = (i, j) ist. Wenn Sie jedoch auf einen Wert mit .at zugreifen, greifen Sie darauf mit .at<Tp>(row, col) zu, was die Umkehrung von (x,y) ist, da row = y und col = x.

So lesen Sie effektiv den Wert an Position (y, x) = (j, i).


Wenn mit Matrix vom Typ CV_16U arbeiten, müssen Sie es .at<Tp> mit der Verwendung zuzugreifen:

  • CV_16UC1: m.at<ushort>
  • CV_16UC2: m.at<Vec2w>
  • CV_16UC3: m.at<Vec3w>
  • CV_16UC4: m.at<Vec4w>

Oder können Sie:

  • Mat1w
  • Mat2w
  • Mat3w
  • Mat4w

und Zugriff auf die Matrix ohne .at, sondern nur mit Klammer: m(r,c)

+0

Ausgezeichneter Punkt. Ich kannte die zwei verschiedenen Parameter-Befehle für Mat.at und Rect, aber es scheint, als ob ich es nicht geschafft hätte, sie zu verbinden. Es stellt sich heraus, dass mein Abzug, dass es ein Typproblem war (in diesem Fall) falsch war und Ihre Antwort mein Problem behob. Um dem Thema gerecht zu werden, wäre es schön, wenn jemand den Typ-Matching-Teil des Problems kommentieren würde: Wenn der CV-Datentyp CV_16S wäre, wie würden wir den Mat.at-Befehl verwenden? Denn dann würde "myMat.at (j, i)", "myMat.at (j, i)" oder "myMat.at (j, i)" immer noch falsche Ergebnisse liefern. – hekimgil

+0

Überprüfen Sie die aktualisierte Antwort – Miki

+0

Vielen Dank, tolle Arbeit. Und mit Ihrer Anleitung habe ich auch [diesen nützlichen Link] (http://ninghang.blogspot.com.tr/2012/11/list-of-mat-type-in-opencv.html) mit einer vollständigen Liste von Mat gefunden Typen in OpenCV und ihre entsprechenden C++ - Typen. – hekimgil

Verwandte Themen