OpenCV - Erstellen Sie ein Array von Mat-Objekte
Ich hätte gedacht, dass das trivial ist, aber ich habe einige Schwierigkeiten mit ihm.
Ich Lesen möchte eine video-Datei in den Speicher, und speichern Sie in einem array. Ich möchte das array von Zeigern auf Matte Objekte.
Dies ist der code den ich verwende:
cv::VideoCapture vidCap = cv::VideoCapture("file.avi");
int frames = (int)vidCap.get(CV_CAP_PROP_FRAME_COUNT);
cv::Mat** frameArray = new cv::Mat*[frames];
for (int num = 0; num < frames; num++) {
frameArray[num] = new cv::Mat;
vidCap >> *(frameArray[num]);
}
Allerdings, wenn ich ein Bild anzuzeigen (Z. B. das erste Bild im array), es zeigt die letzten Rahmen. Wohin gehe ich falsch? Dies ist der code für die Anzeige des Bildes:
cv::namedWindow("Movie", 1);
cv::imshow("Movie", *(frameArray[0]));
cv::waitKey(0);
Ich könnte mir vorstellen, dass, da es ist die Anzeige des letzten Bildes, alle Zeiger im array sind die gleichen, und deshalb wird es geändert wird, den gleichen Speicher. Allerdings, wenn ich printf die Zeiger, Sie sind anders.
Dank im Voraus für Eure Hilfe.
InformationsquelleAutor JonaGik | 2012-02-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es mehr Fehler in Ihrem code. Mindestens zwei von Ihnen sind:
vidCap.get(CV_CAP_PROP_FRAME_COUNT);
nicht zurück, wird die korrekte Anzahl der frames, die meisten der Zeit. Das ist es, ffmpeg kann das nicht besser. Für einige codecs funktioniert es, für manche nicht.Mat Matrizen haben ein Interessantes Verhalten. Sie sind eigentlich Zeiger auf die matrix Daten, die nicht Objekte. Wenn Sie sagen
new Mat
erstellen Sie einfach einen neuen Zeiger. Und kombiniert mit der Tatsache, dass videoCap gibt alle Zeit den gleichen Speicherbereich, nur mit neuen Daten, Sie acutually wird ein Vektor von Zeigern verweist auf das Letzte Bild.Müssen Sie erfassen das Bild in einem separaten Bild und kopieren Sie es in die reservierten Ort:
Bitte beachten Sie die änderung vom array Zeiger auf einen Vektor von Objekten. Dies vermeidet die Notwendigkeit für das Lesen der Anzahl der frames vorher, und macht auch den code sicherer zu machen.
das ist das gleiche wie frame.copyTo(). Ich bevorzuge meine Variante, da es sauber, und OpenCV automatisch befreit den Speicher, wenn es nicht mehr verwendet
Deins klingt besser.
Bezüglich deinem ersten Punkt, gibt es eine Möglichkeit dies zu umgehen? Wie könnte ich die Anzahl der frames in einem video?
Nichts lohnt die Mühe. Aber Sie können ein dynamisches array zu halten Ihre Bilder in. Einen Vektor<Matte> ist so gut wie ein Mat**.
InformationsquelleAutor Sam