Lorsque vous travaillez avec OpenCV, accéder à la valeur de canal d'un pixel particulier peut être crucial pour les tâches de traitement d'image . Cet article répond à une question courante : "Comment puis-je obtenir la valeur de canal pour un pixel spécifique ?"
En supposant que l'image représentée par l'objet Mat foo est dans un format 8 bits couramment utilisé par canal (CV_8UC3), l'obtention des valeurs des canaux nécessite les étapes suivantes :
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... } }
Dans ce code, Vec3b représente un vecteur à 3 canaux où chaque canal correspond aux valeurs Bleu, Vert et Rouge (BGR).
Optimisation des performances :
Pour des raisons de performances, un accès direct au buffer de données peut être privilégié :
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... } }
Alternativement, l'accès basé sur les lignes peut être utilisé :
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... } }
En suivant ces méthodes, vous pouvez récupérer efficacement les valeurs de canal de pixels individuels pour diverses tâches de traitement d'image dans OpenCV.
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!