Maison  >  Article  >  développement back-end  >  Comment accéder aux valeurs des canaux de pixels dans une image Mat dans OpenCV ?

Comment accéder aux valeurs des canaux de pixels dans une image Mat dans OpenCV ?

DDD
DDDoriginal
2024-11-25 01:46:14134parcourir

How do you access pixel channel values in a Mat image in OpenCV?

Extraire les valeurs de canal de pixels d'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.

Utiliser Vec3b

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...
    }
}

Utilisation de l'accès direct au tampon de données

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

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn