Question : Comment pouvez-vous récupérer la valeur de canal d'un pixel spécifique dans une image Mat ?
Réponse :
Pour un objet Mat où le type de pixel est CV_8UC3 (une image 3 canaux non signée de 8 bits), la méthode suivante peut être utilisée :
for(int i = 0; i < foo.rows; i++) { for(int j = 0; j < foo.cols; j++) { Vec3b bgrPixel = foo.at<Vec3b>(i, j); // Process the BGR values... } }
Dans ce code, Vec3b représente un pixel 3 canaux avec des entiers non signés de 8 bits pour chaque canal. at est une fonction membre qui vous permet d'accéder à la valeur du pixel au niveau de la ligne et de la colonne spécifiées.
Optimisation des performances :
Pour des performances améliorées, envisagez d'accéder au tampon de données directement :
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 the BGR values... } }
Vous pouvez également utiliser la ligne méthode :
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 the BGR values... } }
Remarque : OpenCV stocke en interne les images au format BGR, et non RVB.
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!