Heim > Backend-Entwicklung > C++ > Wie konvertiert man OpenCV Mat effizient in ein Array oder einen Vektor?

Wie konvertiert man OpenCV Mat effizient in ein Array oder einen Vektor?

Susan Sarandon
Freigeben: 2024-10-27 03:32:30
Original
355 Leute haben es durchsucht

How to Efficiently Convert OpenCV Mat to an Array or Vector?

Mat in ein Array oder einen Vektor in OpenCV konvertieren

Bei OpenCV-Matrixoperationen besteht gelegentlich die Notwendigkeit, Mat in ein Array oder einen Vektor umzuwandeln . Dieser Artikel bietet eine umfassende Anleitung zum Erreichen solcher Konvertierungen unter Nutzung der robusten Funktionalität von OpenCV.

Direkte Konvertierung in ein Array

Wenn das Mat-Objekt mat über kontinuierlichen Speicher verfügt, können seine Daten dies tun direkt als 1D-Array abgerufen werden:

<code class="cpp">std::vector<uchar> array(mat.rows * mat.cols * mat.channels());
if (mat.isContinuous())
    array = mat.data;</code>
Nach dem Login kopieren

Konvertierung in zeilenbasiertes Array

In Fällen, in denen der Speicher nicht kontinuierlich ist, können die Daten zeilenweise abgerufen werden nach Zeile, was zu einem 2D-Array führt:

<code class="cpp">uchar **array = new uchar*[mat.rows];
for (int i = 0; i < mat.rows; ++i)
    array[i] = new uchar[mat.cols * mat.channels()];

for (int i = 0; i < mat.rows; ++i)
    array[i] = mat.ptr<uchar>(i);</code>
Nach dem Login kopieren

Alternative Vektorkonvertierung

Die Verwendung von std::vector bietet einen alternativen Ansatz zum Konvertieren von Mat in ein Array:

<code class="cpp">std::vector<uchar> array;
if (mat.isContinuous()) {
    // array.assign(mat.datastart, mat.dataend); // May cause issues for sub-matrices
    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>
Nach dem Login kopieren

Konvertieren in Vektoren anderer Typen

Für OpenCV Mats mit anderen Datentypen, wie z. B. CV_32F, ist der Konvertierungsprozess ähnlich:

<code class="cpp">std::vector<float> array;
if (mat.isContinuous()) {
    // array.assign((float*)mat.datastart, (float*)mat.dataend); // May cause issues for sub-matrices
    array.assign((float*)mat.data, (float*)mat.data + mat.total() * mat.channels());
} else {
    for (int i = 0; i < mat.rows; ++i) {
        array.insert(array.end(), mat.ptr<float>(i), mat.ptr<float>(i) + mat.cols * mat.channels());
    }
}</code>
Nach dem Login kopieren

Mat-Datenkontinuität verstehen

Es ist entscheidend, die Mat-Datenkontinuität zu verstehen, um Konvertierungen effektiv durchführen zu können. Wichtige zu beachtende Punkte sind:

  • Mit imread(), clone() oder einem Konstruktor erstellte Matten sind von Natur aus kontinuierlich.
  • Datendiskontinuitäten treten nur auf, wenn eine Matte Daten von einer leiht vorhandene Matte (mit Ausnahme bestimmter Szenarien mit voller Originalbreite).

Das obige ist der detaillierte Inhalt vonWie konvertiert man OpenCV Mat effizient in ein Array oder einen Vektor?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage