在openCV中访问某些像素RGB值

Woo*_*e88 70 c++ opencv

我已经彻底搜索了互联网和stackoverflow,但我没有找到我的问题的答案:

如何在OpenCV中获取/设置(两者)某些(由x,y坐标给定)像素的RGB值?重要的是 - 我用C++编写,图像存储在cv :: Mat变量中.我知道有一个IplImage()运算符,但IplImage在使用中不是很舒服 - 据我所知它来自C API.

是的,我知道在OpenCV 2.2线程中已经有这个Pixel访问,但它只是关于黑白位图.

编辑:

非常感谢您的所有答案.我看到有很多方法来获取/设置像素的RGB值.我从亲密的朋友那里得到了一个想法 - 谢谢Benny!这非常简单有效.我认为这是一个你选择的品味问题.

Mat image;
Run Code Online (Sandbox Code Playgroud)

(......)

Point3_<uchar>* p = image.ptr<Point3_<uchar> >(y,x);
Run Code Online (Sandbox Code Playgroud)

然后你可以读取/写入RGB值:

p->x //B
p->y //G
p->z //R
Run Code Online (Sandbox Code Playgroud)

Boa*_*oaz 90

请尝试以下方法:

cv::Mat image = ...do some stuff...;
Run Code Online (Sandbox Code Playgroud)

image.at<cv::Vec3b>(y,x); 给你RGB(它可能被命名为BGR)矢量类型 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];
Run Code Online (Sandbox Code Playgroud)

  • @Ahmad typedef Vec <uchar,3> Vec3b; - 这意味着3个uchars(0-255)的向量,RGB(R,G和B)的每个分量使用0到255之间的数值表示.图像的"at"方法是cv :: Mat的方法,表示二维矩阵的类.用CV_8UC3的单元格类型表示cv :: Mat意味着矩阵中的每个单元格都适合每个8位的3个通道,通过说image.at <cv :: Vec3b)(y,x)我们实际上说 - "获得矩阵垫中的单元格X,Y作为3个uchars的向量"每个向量单元代表所述通道之一 (2认同)

aar*_*rkk 16

低级方式是直接访问矩阵数据.在RGB图像中(我相信OpenCV通常存储为BGR),并假设您的cv :: Mat变量被调用frame,您可以通过这种方式获取位置(x,y)(从左上角)的蓝色值:

frame.data[frame.channels()*(frame.cols*y + x)];
Run Code Online (Sandbox Code Playgroud)

同样,要获得B,G和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];
Run Code Online (Sandbox Code Playgroud)

请注意,此代码假定步幅等于图像的宽度.

  • 是不是应该是`frame.data [frame.channels()*(frame.cols * y + x)];`? (2认同)