Heim  >  Artikel  >  Backend-Entwicklung  >  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
Susan SarandonOriginal
2024-10-27 03:32:30233Durchsuche

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>

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>

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>

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>

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!

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