首页 > 其他 > 详细

OpenCV访问像素点

时间:2019-05-10 21:58:39      阅读:279      评论:0      收藏:0      [点我收藏+]

三种方法

  • 迭代器
    • 创建一个Mat::Iterator对象it,通过it=Mat::begin()来的到迭代首地址,递增迭代器知道it==Mat::end()结束迭代;
    while (it != Scr.end<Vec3b>())
    {
      //(*it)[0] = 0;//蓝色通道置零;
      (*it)[1] = 0;//绿色通道置零;
      //(*it)[2] = 0;//红色通道置零;
      it++;
    }
  • 指针
    • 调用函数 Mat::ptr(i) 来得到第i行的首地址地址,然后在行内访问像素
    for (int i = 0; i < Row; i++)
    {        
      for (int j = 0; j < Col; j++)
      {       
    
              Scr.ptr<Vec3b>(i)[j][0] = 0;
      }
    }
  • 动态防问at

at的使用

gray.at(i, j) = 0;
cv::mat的成员函数: .at(int y, int x)可以用来存取图像中对应坐标为(x,y)的元素坐标。但是在使用它时要注意,在编译期必须要已知图像的数据类型,这是因为cv::mat可以存放任意数据类型的元素。因此at方法的实现是用模板函数来实现的。

template<typename _Tp> inline
_Tp& Mat::at(int i0, int i1)
{
    CV_DbgAssert(dims <= 2);
    CV_DbgAssert(data);
    CV_DbgAssert((unsigned)i0 < (unsigned)size.p[0]);
    CV_DbgAssert((unsigned)(i1 * DataType<_Tp>::channels) < (unsigned)(size.p[1] * channels()));
    CV_DbgAssert(CV_ELEM_SIZE1(traits::Depth<_Tp>::value) == elemSize1());
    return ((_Tp*)(data + step.p[0] * i0))[i1];
}

假设提前已知一幅图像img的数据类型为 unsigned char型灰度图(单通道),要对坐标为(14,25)的像素重新赋值为25,则对应操作如下:
srcImage.at<uchar>(14,25) = 25;
如果要操作的图片img是一幅数据类型同样为unsigned char的彩色图片,再次要求将坐标(14,25)的像素赋值为25。这个操作跟上面的就有点区别了,需要对这个像素三个通道的每个对应元素赋值,Opencv中图像三原色在内存中的排列顺序为B-G-R(见下面注释),操作过程如下:
```
img.at(14,25) [0]= 25;//B

img.at< Vec3b >(14,25) [1]= 25;//G 

img.at< Vec3b >(14,25 [2]= 25;//R

```

OpenCV访问像素点

原文:https://www.cnblogs.com/elong1995/p/10846948.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!