Heim  >  Artikel  >  Backend-Entwicklung  >  Wie konvertiere ich ein Mat-Objekt in ein Array oder einen Vektor in OpenCV?

Wie konvertiere ich ein Mat-Objekt in ein Array oder einen Vektor in OpenCV?

Barbara Streisand
Barbara StreisandOriginal
2024-10-26 13:48:02193Durchsuche

How to Convert a Mat Object to an Array or Vector 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn