Heim >Backend-Entwicklung >C++ >Wie konvertiere ich ein OpenCV-Mat-Objekt effizient in ein C-Array oder einen C-Vektor?
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:
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!