imread
gibt eine Mat
, nicht CvMat
zurück. Sie sind die zwei verschiedenen Schnittstellen ( Mat
/ imread
für C ++ und Ipl ... und Cv .. für C-Schnittstelle).
Die C ++ - Schnittstelle ist schöner, sicherer und einfacher zu benutzen. Es verarbeitet automatisch Speicher für Sie und ermöglicht Ihnen, weniger Code für dieselbe Aufgabe zu schreiben. Die OpenCV-Leute befürworten die Verwendung von C ++, es sei denn, einige sehr spezifische Projektanforderungen zwingen Sie zu C.
Beispiel (C ++)
%Vor% Beachten Sie, dass, wenn nicht anders angegeben, alle Matrixzuordnungen auf dieselben Daten verweisen. Im obigen Beispiel zeigt die crop
-Matrix auf image
, und wenn Sie sie auf Null setzen, wird dieser spezifische Teil von image
auf 0 gesetzt.
Um eine neue Kopie der Daten zu erstellen, verwenden Sie Mat :: copyTo oder Mat :: clone ();
Und die C-Schnittstelle
%Vor%IplImage und Mat sind beide miteinander konvertierbar.
Ich würde vorschlagen, dass Sie Mat und imread () verwenden, da es sehr einfach ist, Daten von Mat zu erhalten.
Mat :: data gibt einen Zeiger auf die tatsächlichen Matrixdaten zurück, die in 1D und den Werten leicht zugänglich sind. Ссылка
Wenn Sie Machine-Learning-Konzepte in OpenCV für verschiedene Tracking-Algorithmen (zB OpenTLD) hinzufügen möchten, können Sie einfach mit Mat.data auf Daten zugreifen, um den Zeiger auf die tatsächliche Matrix zu bekommen.
Viele der Utilities von OpenCV (zB CalcOpticalFlowPyrLK, etc) erfordern Mat. Ich würde vorschlagen, dass Sie Mat verwenden. IplImage ist jetzt eine alte Sache.
Dies hängt davon ab, wie komfortabel Sie mit Zeigern sind. In IplImage können Sie auf Daten wie
zugreifen %Vor%wobei i, j, k einige Ganzzahlen sind, was ziemlich einfach ist. In der normalen Matrix der 3-Dimension ist es nicht so einfach, auf Daten zuzugreifen. Bei normalen Matrixdaten erfolgt der Zugriff für a [i] [j]
%Vor%Von OpenCV_2 Kochbuch:
Diese Struktur wurde von der IPL-Bibliothek übernommen (das ist die Intel Image Processing Library), die jetzt in die IPP - Bibliothek (Intel Integrated Performance Primitive-Bibliothek). Wenn Sie Code und Bibliotheken verwenden, mit denen erstellt wurde Bei der alten C-Schnittstelle müssen Sie möglicherweise diese IplImage-Strukturen manipulieren. Glücklicherweise, Es gibt eine bequeme Möglichkeit, ein IplImage in ein cv :: Mat-Objekt zu konvertieren.
IplImage * iplImage = cvLoadImage ("c: \ img.jpg"); cv :: Mat image4 (iplImage, false);
Die Funktion cvLoadImage ist die C-Interface-Funktion zum Laden von Bildern. Der zweite Parameter im Konstruktor des cv :: Mat-Objekts gibt an, dass die Daten nicht kopiert werden (setzen Sie sie auf true, wenn Sie eine neue Kopie wünschen, während false der Standardwert ist und daher weggelassen werden könnte. Das heißt, sowohl IplImage als auch image4 teilen dieselben Bilddaten. Du musst vorsichtig sein hier, um nicht hängende Zeiger zu erzeugen. Aus diesem Grund ist es sicherer, das IplImage einzukapseln Zeiger in die Referenzzähler Klasse von OpenCV 2:
cv :: Ptr iplImage = cvLoadImage ("c: \ img.jpg");
Andernfalls müssen Sie den Speicher freigeben, auf den Ihre IplImage-Struktur zeigt muss es explizit tun: cvReleaseImage (& amp; iplImage); Denken Sie daran, dass Sie diese veraltete Datenstruktur vermeiden sollten. Benutze stattdessen immer Lebenslauf :: Mat.
Tags und Links opencv opencvdotnet