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

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

Linda Hamilton
Linda HamiltonOriginal
2024-10-26 14:08:03784Durchsuche

How do I efficiently convert an OpenCV Mat object to a C   array or vector?

Mat in Array/Vektor in OpenCV konvertieren

In OpenCV ist der Zugriff auf und die Bearbeitung von Bilddaten für verschiedene Bildverarbeitungsaufgaben von entscheidender Bedeutung. Eine häufige Anforderung ist die Konvertierung des Mat-Objekts, das ein Bild oder eine Matrix darstellt, in ein Array oder einen Vektor.

Konvertierung in ein Array

Wenn der Speicher des Mat-Objekts kontinuierlich ist, was bedeutet, dass alle seine Daten nacheinander gespeichert werden, können Sie mit dem folgenden Code direkt ein 1D-Array erhalten:

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

wobei mat das Mat-Objekt ist, array das konvertierte Array, .rows, .cols , und .channels() stellen die Bildabmessungen und die Anzahl der Kanäle dar, und .data ist ein Zeiger auf die Bilddaten.

Konvertierung in Vektor

Für Nicht- Kontinuierliche Mats, Daten müssen Zeile für Zeile abgerufen werden. Hier ist ein Beispiel für die Konvertierung in ein 2D-Array/-Vektor:

<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>

Die Verwendung eines std::vector kann die Konvertierung jedoch vereinfachen:

<code class="cpp">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 Data Continuity

Das Verständnis der Mat-Datenkontinuität ist für eine effiziente Konvertierung von entscheidender Bedeutung. Hier sind einige wichtige Punkte:

  • Mit imread(), clone() oder einem Konstruktor erstellte Matten sind immer kontinuierlich.
  • Matten werden nur dann nicht kontinuierlich, wenn sie Daten ausleihen aus einer vorhandenen Matte (außer beim Ausleihen einzelner Zeilen oder mehrerer Zeilen mit voller Originalbreite).

Zum Beispiel im folgenden Codeausschnitt:

<code class="cpp">cv::Mat image = cv::imread("image.jpg"); // continuous Mat
cv::Mat sub_image = image(cv::Rect(100, 100, 100, 100)); // non-continuous Mat since it borrows data from `image`</code>

Bild ist ein fortlaufendes Bild Mat, weil es mit imread() erstellt wurde, während sub_image nicht kontinuierlich ist, weil es auf einen Teil der Bild-Mat verweist.

Das obige ist der detaillierte Inhalt vonWie konvertiere ich ein OpenCV-Mat-Objekt effizient in ein C-Array oder einen C-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