Bei der Arbeit mit OpenCV kann der Zugriff auf den Kanalwert eines bestimmten Pixels für Bildverarbeitungsaufgaben von entscheidender Bedeutung sein . Dieser Artikel befasst sich mit einer häufig gestellten Frage: „Wie erhalte ich den Kanalwert für ein bestimmtes Pixel?“
Angenommen, das durch das Mat-Objekt foo dargestellte Bild liegt in einem häufig verwendeten 8-Bit-Format vor pro Kanalformat (CV_8UC3) erfordert das Erhalten der Kanalwerte die folgenden Schritte:
for(int i = 0; i < foo.rows; i++) { for(int j = 0; j < foo.cols; j++) { Vec3b bgrPixel = foo.at<Vec3b>(i, j); // Process B, G, and R values here... } }
In In diesem Code stellt Vec3b einen 3-Kanal-Vektor dar, wobei jeder Kanal den Werten Blau, Grün und Rot (BGR) entspricht.
Leistungsoptimierung:
Aus Performancegründen kann ein direkter Zugriff auf den Datenpuffer bevorzugt 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 B, G, and R values here... } }
Alternativ: Der zeilenbasierte Zugriff kann verwendet werden:
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 B, G, and R values here... } }
Durch Befolgen dieser Methoden können Sie die Kanalwerte einzelner Pixel für verschiedene Bildverarbeitungsaufgaben in OpenCV effizient abrufen.
Das obige ist der detaillierte Inhalt vonWie greife ich auf den Kanalwert eines bestimmten Pixels in einem OpenCV Mat-Bild zu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!