CvMat und Imread Vs IpImage und CvLoadImage

8

Verwenden von OpenCv 2.4

Ich habe zwei Möglichkeiten Bilder zu laden:

%Vor%

Welche ist besser zu benutzen? Ich habe versucht, die beiden zu mischen und in Seg-Fehler enden.

    
gpuguy 20.06.2012, 08:05
quelle

4 Antworten

13

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%     
Sam 20.06.2012, 08:38
quelle
0

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.

    
Froyo 20.06.2012 10:23
quelle
0

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%     
nbsrujan 20.06.2012 11:09
quelle
0

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.

    
Ahmed Ramzy 08.07.2015 23:03
quelle

Tags und Links