opencv3.0中的cv::Mat类学习日记(at函数以及ptr函数,cv::Mat迭代器访问数组)

上一章介绍了如何创建cv::Mat类的数组,学习了cv::Mat的成员函数,构造函数,复制构造函数,模板函数以及静态构造函数来创建图像数组的方法。
想一想,我们已经构造好了数组并且填充了我们想要的图像数据,但是我们如何访问这些数组里面的数据呢? 别担心,天无绝人之路,正所谓车到山前必有路嘛,opencv大佬们早就想好了如何应对这一难题,这不整出了成员函数at<>()和ptr<>()以及迭代器的方法;
接下来我们就熟悉熟悉吧,come on 谁怕谁,不就是找到我想要的数据吗,来,就是刚。
成员函数at();
这是第一个哈,看看他的形状,type类型也就是数据类型,比如float,int,Vec3f,Vec2f之类的,简单点就是数组中数据元素的类型。
举个例子哈:image.at(i,j);// 意思就是读取图像image中第i行,第j列那个像素;
还是整个程序看看,这样更清晰,比如:

  cv::Mat  image(3,10,CV_32FC3);
     for(int i=0; i<image.rows;i++)
     {
        for(int j=0; j<image.cols; j++)
        {
          image.at<Vec3f>(i,j)[0]=image.at<Vec3f>(i.j)[0] / div * div +div / 2;
          image.at<Vec3f>(i,j)[1]=image.at<Vec3f>(i.j)[1] / div * div +div / 2;
          image.at<Vec3f>(i,j)[2]=image.at<Vec3f>(i.j)[2] / div * div +div / 2;
        }
     };

是不是有点云里雾里,额,应该不会,像我这么笨的都看懂了,哈哈。
当然上面这种方法可以遍历整个图像像素,但这不是最好的方法,看看下面吧!
成员函数ptr(),是不是蒙了,这长相跟上面那哥们不是一个样吗,额,额,别急,一个妈生的也不见得个个相似嘛。ptr<>()这哥们就是一个特例,它用的是指针操作,好吧我也是指针新手,只要记住他是地址就行了。
ptr<>()是按照行来访问数组的,指针指向某一行第一个元素的首地址,呵,好方法,如果要知道这一行所有数据,只要地址++不就完事儿了吗,恩恩,实际中就是这样。下面给个代码就明白了:

cv::Mat image (3,10,float);
cv::Mat newimage(image.size(), image.type());
for(int i=0; i<image.rows; i++)
  {
      uchar *data=image.ptr<uchar>(i);
      uchar *outdata=newimage.ptr<uchar>(i);
     for(int j=0; j<image.cols; j++)
        {
           outdata[ j ]= data[ j ] /div * div + div / 2;
         }
  };

看懂没有? 额,其实我也是照猫画虎,看懂了别人的然后自己改的程序,是不是自己的无所谓,关键是得学懂东西嘛。
现在得介绍第三种遍历数组的方法了,迭代器,这种方法啊我只 搞懂了两种。
一个是基于STL容器下的opencv提供的处理静态的cv::MatConstIterator<>和cv::MatIterator<>,这两个迭代器是opencv提供的一对迭代器模板,前者是只读的,后者是非只读的(我也没搞清这是啥意思),与之配套的还有cv::Mat的两个成员函数begin<>()和end<>(),前者是返回vector中的起始元素的迭代器,后者是返回vector中的末尾元素下一个元素的迭代器,有了这起始和末尾我么就可以利用指针来遍历所有元素了,是不是很管用。
Iterator有两种调用的方法:
其一:cv::MatIterator_ it ;
其二:cv::Mat_::Iterator it ;
举个例子吧:

cv::MatIterator_<float> it = image.begin<float>();
cv::MatIterator_<float> itend = image.end<float>();
if (  ; it ! = itend; it ++)
   {
      (*it) = ( *it) / div * div + div / 2;
   }//end of line

另外一种形式迭代器:数组迭代器NAryMatIterator·················呃呃呃没太搞懂

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值