Zugriff auf Pixelwerte in einer OpenCV-Matrix
Das Abrufen von Pixelwerten aus einem OpenCV-Mat-Bild kann über verschiedene Methoden basierend auf der Datenstruktur erfolgen Wird zur Darstellung der Pixel verwendet.
Angenommen, es handelt sich um ein Bild vom Typ CV_8UC3, bei dem jedes Pixel durch drei dargestellt wird 8-Bit-Kanäle ohne Vorzeichen (BGR) können den Wert eines bestimmten Pixels wie folgt abrufen:
for (int i = 0; i < foo.rows; i++) { for (int j = 0; j < foo.cols; j++) { Vec3b bgrPixel = foo.at<Vec3b>(i, j); // Access and manipulate BGR values... } }
Vec3b ist ein Container für 3-Element-Vektoren, wobei jedes Element einem B, G und entspricht R-Kanal-Wert.
Leistung optimieren
Um die Leistung zu verbessern, direkter Zugriff auf Datenpuffer kann verwendet werden:
uint8_t* pixelPtr = (uint8_t*)foo.data; int cn = foo.channels(); Scalar_<uint8_t> bgrPixel; for (int i = 0; i < foo.rows; i++) { for (int j = 0; j < foo.cols; j++) { bgrPixel.val[0] = pixelPtr[i * foo.cols * cn + j * cn + 0]; // B bgrPixel.val[1] = pixelPtr[i * foo.cols * cn + j * cn + 1]; // G bgrPixel.val[2] = pixelPtr[i * foo.cols * cn + j * cn + 2]; // R // Process BGR values... } }
Alternativ kann die row()-Methode verwendet werden, um auf einzelne Zeilen zuzugreifen:
int cn = foo.channels(); Scalar_<uint8_t> bgrPixel; for (int i = 0; i < foo.rows; i++) { uint8_t* rowPtr = foo.row(i); for (int j = 0; j < foo.cols; j++) { bgrPixel.val[0] = rowPtr[j * cn + 0]; // B bgrPixel.val[1] = rowPtr[j * cn + 1]; // G bgrPixel.val[2] = rowPtr[j * cn + 2]; // R // Process BGR values... } }
Das obige ist der detaillierte Inhalt vonWie kann ich effizient auf Pixelwerte in einer OpenCV-Matrix zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!