2016-05-12 4 views
3

Ich möchte die opencv cv::Mat Funktion push_back verwenden, um neue Zeilen zu einer Matrix hinzuzufügen, aber ich möchte die Größe der Matrix vorschreiben, so dass die Daten nicht ständig neu zugeordnet werden müssen. Die cv::mat::reserve Funktion hat eine Anzahl von Zeilen Parameter, aber das bedeutet, dass Sie die Anzahl der Spalten (und Datengröße zuerst) angeben müssen. Also würde der Code, den ich unterstelle, mir am Anfang eine leere Zeile geben, die ich nicht möchte. Gibt es einen geeigneten Weg, dies zu tun mit reserve und push_back?Wie benutzt man opencv Mat reserve? mit push_back

cv::Mat M(1, size_cols, CV_32FC1); 
M.reserve(size_rows); 
for (int i = 0; i < size_rows; i++) 
{ 
    GetInputMatrix(A); 
    M.push_back(A.row(i)); 
} 

Hinweis: Obwohl der Beispielcode es nicht zeigen, ich bin mir nicht sicher über die genaue Größe der endgültigen Matrix, aber ich kann einen Maximalwert Größe zu reservieren erhalten.

Antwort

0

Nun, nach documentation,

Reserve tut:

Verfahren reserviert Platz für sz Reihen. Wenn die Matrix bereits genug Platz zum Speichern von sz Zeilen hat, passiert nichts. Wenn die Matrix neu zugewiesen wird, bleiben die ersten Zeilen von Mat :: rows erhalten. Die Methode emuliert die entsprechende Methode der STL-Vektorklasse.

Abgesehen davon, solange Sie nicht diese riesige Menge an Daten speichern, passiert nichts.

2

Die Verwendung einer leeren Matte am Anfang ist in Ordnung. Die Spaltennummer und der Typ werden über die erste push_back ermittelt.

cv::Mat M; // empty mat in the beginning 
M.reserve(size_rows); 
for (int i = 0; i < size_rows; i++) { 
    GetInputMatrix(A); 
    M.push_back(A.row(i)); 
} 
+0

Vielen Dank, ich hoffe, dass dies tatsächlich den Raum im Voraus reserviert. Ich bin etwas skeptisch. – Geronimo