Maison > Article > développement back-end > Comment accéder aux valeurs des canaux de pixels dans une image Mat dans OpenCV ?
Dans OpenCV, il existe plusieurs façons d'accéder et de manipuler les valeurs de pixels dans une image Mat. Un scénario courant consiste à récupérer la valeur de canal d'un pixel spécifique.
Si l'image est stockée au format CV_8UC3, qui représente une image à trois canaux avec un entier non signé de 8 bits valeurs (BGR), vous pouvez utiliser le type de données Vec3b pour accéder aux canaux individuels. Par exemple, si foo est une image Mat de ce type, vous pouvez parcourir les pixels en utilisant le code suivant :
for (int i = 0; i < foo.rows; i++) { for (int j = 0; j < foo.cols; j++) { Vec3b bgrPixel = foo.at<Vec3b>(i, j); // Access the pixel's BGR values... } }
Pour des raisons de performances, vous pouvez accédez également aux valeurs de pixels directement en accédant au tampon de données. Cela permet un accès plus rapide mais nécessite une gestion plus manuelle de la conversion des données et des décalages de canal. Voici un exemple de la façon de procéder :
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 // Access the pixel's BGR values... } }
Alternativement, vous pouvez également utiliser la méthode row() pour accéder aux lignes individuelles de l'image, comme indiqué dans ce qui suit code :
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 // Access the pixel's BGR values... } }
N'oubliez pas qu'OpenCV stocke les valeurs des pixels au format BGR (Bleu, Vert, Rouge) au lieu de RVB, vous devez donc être attentif de cela lors de l'accès aux chaînes.
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!