Maison >développement back-end >C++ >Comment extraire les valeurs de canal de pixels d'une image Mat dans OpenCV ?

Comment extraire les valeurs de canal de pixels d'une image Mat dans OpenCV ?

DDD
DDDoriginal
2024-11-15 22:47:02776parcourir

How to Extract Pixel Channel Values from a Mat Image in OpenCV?

OpenCV : Extraire les valeurs de canal de pixel à partir d'images Mat

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!

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