首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >访问openCV中的某些像素RGB值

访问openCV中的某些像素RGB值
EN

Stack Overflow用户
提问于 2012-01-20 04:35:21
回答 6查看 148.2K关注 0票数 80

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

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

是的,我知道已经有了这个 线程,但它只是关于黑白位图的。

编辑:

非常感谢你的回答。我看到有很多方法可以获取/设置像素的RGB值。我从我的好朋友那里又得到了一个主意--谢谢Benny!这是非常简单和有效的。我认为这只是你选择哪一个的品味问题。

代码语言:javascript
复制
Mat image;

(...)

代码语言:javascript
复制
Point3_<uchar>* p = image.ptr<Point3_<uchar> >(y,x);

然后,您可以使用以下命令来读/写RGB值:

代码语言:javascript
复制
p->x //B
p->y //G
p->z //R
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-01-20 04:55:05

尝试以下操作:

代码语言:javascript
复制
cv::Mat image = ...do some stuff...;

image.at<cv::Vec3b>(y,x);给出了cv::Vec3b类型的RGB (它可能被排序为BGR)向量

代码语言:javascript
复制
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];
票数 100
EN

Stack Overflow用户

发布于 2012-01-20 04:52:14

低级方法是直接访问矩阵数据。在RGB图像(我相信OpenCV通常将其存储为BGR)中,假设您的cv::Mat变量名为frame,您可以通过以下方式获得location (xy)处的蓝色值(从左上角开始):

代码语言:javascript
复制
frame.data[frame.channels()*(frame.cols*y + x)];

同样,要获得B、G和R:

代码语言:javascript
复制
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];

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

票数 19
EN

Stack Overflow用户

发布于 2013-08-26 08:34:11

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

代码语言:javascript
复制
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.
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8932893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档