Heim >Backend-Entwicklung >C++ >Wie konvertiere ich ein Mat-Objekt in ein Array oder einen Vektor in OpenCV?
Mat in Array in OpenCV konvertieren
OpenCV bietet verschiedene Methoden zum Konvertieren zwischen verschiedenen Datenstrukturen. In diesem Artikel konzentrieren wir uns auf die Konvertierung von einem Mat-Objekt in ein Array oder einen Vektor.
Direkte Konvertierung von Mat in Array
Für eine kontinuierliche Mat, wo Die Daten werden zusammenhängend im Speicher gespeichert, Sie können direkt auf die Daten als 1D-Array zugreifen:
<code class="cpp">cv::Mat mat; // ... std::vector<uchar> array(mat.rows * mat.cols * mat.channels()); if (mat.isContinuous()) { array = mat.data; }</code>
Konvertierung in 2D-Array
Für eine nicht kontinuierliche Mat , können Sie seine Daten Zeile für Zeile abrufen und in einem 2D-Array speichern:
<code class="cpp">cv::Mat mat; // ... std::vector<std::vector<uchar>> array(mat.rows); for (int i = 0; i < mat.rows; ++i) { array[i] = std::vector<uchar>(mat.cols * mat.channels()); array[i] = mat.ptr<uchar>(i); }</code>
Konvertierung in Vektor
Wenn Sie den Vektor der C-Standardbibliothek verwenden, können Sie kann den folgenden Ansatz verwenden:
<code class="cpp">cv::Mat mat; // ... std::vector<uchar> array; if (mat.isContinuous()) { array.assign(mat.data, mat.data + mat.total() * mat.channels()); } else { for (int i = 0; i < mat.rows; ++i) { array.insert(array.end(), mat.ptr<uchar>(i), mat.ptr<uchar>(i) + mat.cols * mat.channels()); } }</code>
Mat-Datenkontinuität
Es ist erwähnenswert, dass die Kontinuität einer Mat die Effizienz des Datenzugriffs beeinflusst. Von imread(), clone() oder einem Konstruktor erstellte Matrizen sind normalerweise kontinuierlich. Umgekehrt sind Matrizen, die aus einem ROI (Region of Interest) einer größeren Matte erstellt wurden, möglicherweise nicht kontinuierlich.
Dieser Codeausschnitt zeigt die Unterschiede in der Datenkontinuität:
<code class="cpp">cv::Mat big_mat = cv::Mat::zeros(1000, 1000, CV_8UC3); cv::Mat sub_mat = big_mat(cv::Rect(10, 10, 100, 100)); std::cout << "big_mat is continuous: " << big_mat.isContinuous() << std::endl; // true std::cout << "sub_mat is continuous: " << sub_mat.isContinuous() << std::endl; // false</code>
Das obige ist der detaillierte Inhalt vonWie konvertiere ich ein Mat-Objekt in ein Array oder einen Vektor in OpenCV?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!