Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c++ and opencv get and set pixel color to Mat

I'm trying to set a new color value to some pixel into a cv::Mat image my code is below:

    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); 

It seems to get the good pixel in output (with cout) however in the output image (with imwrite) the pixel concerned aren't modified. I have already tried using color.val[0].. I still can't figure out why the pixel colors in the output image dont change. thanks

like image 354
grll Avatar asked Apr 11 '14 00:04

grll


2 Answers

You did everything except copying the new pixel value back to the image.

This line takes a copy of the pixel into a local variable:

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

So, after changing color as you require, just set it back like this:

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

So, in full, something like this:

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>(y,x);          // ... do something to the color ....         color[0] = 13;         color[1] = 13;         color[2] = 13;          // set pixel         //image.at<Vec3b>(Point(x,y)) = color;         //if you copy value     } } 
like image 56
Roger Rowland Avatar answered Oct 06 '22 01:10

Roger Rowland


just use a reference:

Vec3b & color = image.at<Vec3b>(y,x); color[2] = 13; 
like image 27
berak Avatar answered Oct 05 '22 23:10

berak