在openCV中访问某个像素的RGB值

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

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

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

编辑:

非常感谢您的答复。 我发现有很多方法可以获取/设置像素的RGB值。 我从我亲密的朋友那里得到了一个更多的想法 - 谢谢Benny! 这非常简单和有效。 我认为这是你挑选哪一种的品味问题。

Mat image;

(......)

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

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

p->x //B
p->y //G
p->z //R

尝试以下操作:

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

image.at<cv::Vec3b>(y,x); 为您提供cv::Vec3b类型的RGB(它可能被命令为BGR)矢量

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

低级方法是直接访问矩阵数据。 在RGB图像中(我相信OpenCV通常以BGR的形式存储),并假设你的cv :: Mat变量被称为frame ,你可以通过这种方式在位置( xy )(从左上角)得到蓝色值:

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

同样,要获得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];

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


对于有这种问题的人来说,一段代码更容易。 我分享我的代码,你可以直接使用它。 请注意OpenCV将像素存储为BGR。

cv::Mat vImage_; 

if(src_)
{
    cv::Vec3f vec_;

    for(int i = 0; i < vHeight_; i++)
        for(int j = 0; j < vWidth_; j++)
        {
            vec_ = cv::Vec3f((*src_)[0]/255.0, (*src_)[1]/255.0, (*src_)[2]/255.0);//Please note that OpenCV store pixels as BGR.

            vImage_.at<cv::Vec3f>(vHeight_-1-i, j) = vec_;

            ++src_;
        }
}

if(! vImage_.data ) // Check for invalid input
    printf("failed to read image by OpenCV.");
else
{
    cv::namedWindow( windowName_, CV_WINDOW_AUTOSIZE);
    cv::imshow( windowName_, vImage_); // Show the image.
}
链接地址: http://www.djcxy.com/p/67001.html

上一篇: Accessing certain pixel RGB value in openCV

下一篇: Pixel access in OpenCV 2.2