Accès aux valeurs de pixels dans une matrice OpenCV
L'obtention des valeurs de pixels à partir d'une image OpenCV Mat peut être effectuée via diverses méthodes basées sur la structure des données utilisé pour représenter les pixels.
En supposant une image de type CV_8UC3, où chaque pixel est représenté par trois 8 bits canaux non signés (BGR), la récupération de la valeur d'un pixel particulier peut être obtenue comme suit :
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 est un conteneur pour vecteurs à 3 éléments, où chaque élément correspond à une valeur de canal B, G et R. .
Optimisation des performances
Pour améliorer les performances, un accès direct au tampon de données peut être used:
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... } }
Alternativement, la méthode row() peut être utilisée pour accéder à des lignes individuelles :
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... } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!