c++ et opencv obtiennent et définissent la couleur des pixels sur Mat
-
20-12-2019 - |
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
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