Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Accessing certain pixel RGB value in openCV

Tags:

c++

opencv

I have searched internet and stackoverflow thoroughly, but I haven't found answer to my question:

How can I get/set (both) RGB value of certain (given by x,y coordinates) pixel in OpenCV? What's important-I'm writing in C++, the image is stored in cv::Mat variable. I know there is an IplImage() operator, but IplImage is not very comfortable in use-as far as I know it comes from C API.

Yes, I'm aware that there was already this Pixel access in OpenCV 2.2 thread, but it was only about black and white bitmaps.

EDIT:

Thank you very much for all your answers. I see there are many ways to get/set RGB value of pixel. I got one more idea from my close friend-thanks Benny! It's very simple and effective. I think it's a matter of taste which one you choose.

Mat image; 

(...)

Point3_<uchar>* p = image.ptr<Point3_<uchar> >(y,x); 

And then you can read/write RGB values with:

p->x //B p->y //G p->z //R 
like image 399
Wookie88 Avatar asked Jan 19 '12 20:01

Wookie88


2 Answers

Try the following:

cv::Mat image = ...do some stuff...; 

image.at<cv::Vec3b>(y,x); gives you the RGB (it might be ordered as BGR) vector of type cv::Vec3b

image.at<cv::Vec3b>(y,x)[0] = newval[0]; image.at<cv::Vec3b>(y,x)[1] = newval[1]; image.at<cv::Vec3b>(y,x)[2] = newval[2]; 
like image 121
Boaz Avatar answered Oct 05 '22 01:10

Boaz


The low-level way would be to access the matrix data directly. In an RGB image (which I believe OpenCV typically stores as BGR), and assuming your cv::Mat variable is called frame, you could get the blue value at location (x, y) (from the top left) this way:

frame.data[frame.channels()*(frame.cols*y + x)]; 

Likewise, to get B, G, and R:

uchar b = frame.data[frame.channels()*(frame.cols*y + x) + 0];     uchar g = frame.data[frame.channels()*(frame.cols*y + x) + 1]; uchar r = frame.data[frame.channels()*(frame.cols*y + x) + 2]; 

Note that this code assumes the stride is equal to the width of the image.

like image 44
aardvarkk Avatar answered Oct 05 '22 02:10

aardvarkk