Question

J'essaie de définir une nouvelle valeur de couleur sur un pixel dans une image cv::Mat, mon code est ci-dessous :

    Mat image = img;
    for(int y=0;y<img.rows;y++)
    {
        for(int x=0;x<img.cols;x++)
        {
        Vec3b color = image.at<Vec3b>(Point(x,y));
        if(color[0] > 150 && color[1] > 150 && color[2] > 150)
        {
            color[0] = 0;
            color[1] = 0;
            color[2] = 0;
            cout << "Pixel >200 :" << x << "," << y << endl;
        }
        else
        {
            color.val[0] = 255;
            color.val[1] = 255;
            color.val[2] = 255;
        }
    }
    imwrite("../images/imgopti"+to_string(i)+".tiff",image);

Il semble obtenir le bon pixel en sortie (avec cout) cependant dans l'image de sortie (avec imwrite) les pixels concernés ne sont pas modifiés.J'ai déjà essayé d'utiliser color.val[0]..Je n'arrive toujours pas à comprendre pourquoi les couleurs des pixels dans l'image de sortie ne changent pas.merci

Était-ce utile?

La solution

Vous avez tout fait sauf copier la nouvelle valeur de pixel dans l'image.

Cette ligne prend une copie du pixel dans une variable locale :

Vec3b color = image.at<Vec3b>(Point(x,y));

Donc après avoir changé color selon vos besoins, remettez-le simplement comme ceci :

image.at<Vec3b>(Point(x,y)) = color;

Donc, au complet, quelque chose comme ça :

Mat image = img;
for(int y=0;y<img.rows;y++)
{
    for(int x=0;x<img.cols;x++)
    {
        // get pixel
        Vec3b color = image.at<Vec3b>(Point(x,y));

        // ... do something to the color ....

        // set pixel
        image.at<Vec3b>(Point(x,y)) = color;
    }
}

Autres conseils

Utilisez simplement une référence:

Vec3b & color = image.at<Vec3b>(y,x);
color[2] = 13;

Je n'utiliserais pas .at pour des raisons de performance.

Définir une structure:

//#pragma pack(push, 2) //not useful (see comments below)
struct RGB {
    uchar blue;
    uchar green;
    uchar red;  };

puis utilisez-le comme ceci sur votre CV :: Mat Image:

RGB& rgb = image.ptr<RGB>(y)[x];

image.ptr (Y) vous donne un pointeur à la ligne Scanline Y.Et itérer à travers les pixels avec des boucles de x et y

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top