mat.at<int>( i ); 整型数组问中的元素 i
mat.at<float>( i,j ); 浮点型数组附中的元素(i, j)
mat.at<int>( pt ) 整型矩阵问中处于 (pt.x,pt.y) 的元素
mat.at<float>( i,j,k ); 三维浮点型矩阵M 中处于 (1,j,k) 位置的元素
mat.at<uchar>( idx ); 无符号字符数组问中位于idx[ ]所索引的n维位置的元素

为了访问二维数组,你可以使用 C风格的指针来指定某行 。这个工作由cv::Mat类的成员函数 ptr<>()完成(再次强调,数组中的数据是按行连续组织的,因此不可以通过这种方式访问一个指定的列),由于at<>(),ptr<>() 都是模板函数,所以需要一个类型名来进行实例化。函数接收一个整型参数来指示希望指针指向的行,函数将返回一个和矩阵原始数据类型相同的数据指针(比如说,如果数组类型是CV_32FC3,它会返回一个float* 。因此,给定一个类型为float三通道的矩阵mtx,结构体mtx.ptr<VeC3f>(3)将会返回mtx的第三行指向第一个元素第一个(浮点)通道的指针,这通常是访问数组最快的方式,因为一旦你拥有指针,就可以向指定的位置写入数据。

使用at<>和利用指针访问的差距取决于编译器的优化程度。使用at<>进行存储性能更接近于好的优化器所能够达到的效果(尽管稍微慢一些)但是如果优化器被关闭了,其性能相较于没有优化器优化会有一个数量级的提升。 而通过迭代器的访问几乎总是比这两种方法都要慢,然而在几乎所有情况下,使用内置的opencv函数都比你写的所有通过循环来控制直接访问的方法快,所以在任何情况下,都要避免通过循环来大量访问矩阵内部结构。

有两种方式可以获得一个指向矩阵的数据区域的指针。一种是使用ptr<>()成员函数,另一种是直接使用数据指针data,然后使用成员数组step来计算地址,后者更接近于C语言操作。但是一般来说,由于at<>()和ptr<>()以及迭代器的存在,这种方式已经不再推荐了。

直接计算地址始终是最有效率的做法,尤其是要处理多于二维的数组时!

 int sz[3] = { 4, 4, 4 };cv::Mat m(3, sz, CV_32FC3); // A three-dimensional array of size 4-bY-4-bY-4cv::randu(m, -1.0f, 1.0f); // fill with random numbers from -1.0 to 1.0for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){for (int k = 0; k < 4; k++){cout << m.at<float>(i, j, k) << " ";}cout << "\n";}cout << "\n";}float max = 0.0f;//cv::MatConstIterator<Vec3f> it = m.begin();//cv::MatConstIterator it = m.begin();for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){float *data = m.ptr<float>(i, j);for (int k = 0; k < 4; k++){float len2;len2 = *data + *(data + 1) + *(data + 2) + *(data + 3);if ( len2 > max )max = len2;}}}cout << "max = " << max << endl;

【opencv】 使用at和ptr指针访问像素的区别相关推荐

  1. OpenCV(总结篇)图像逐像素访问(三种操作:指针、迭代器、at()函数)

    目录 概述 1.指针访问 2.迭代器访问 3.at()函数访问 总代码 效果 参考资料 概述 访问图像像素值是图像处理的基本操作.OpenCV提供了很多访问方式,比较常用的三种方式:  (1) 通过指 ...

  2. 如何用指针访问opencv cv::Mat数据?ptr<uchar>()

    示例: #include <opencv2/opencv.hpp> #include <iostream>using namespace cv; using namespace ...

  3. 【OpenCV】OpenCV实战从入门到精通之 -- 访问图像中的像素

    目录 1.图像在内存之中的存储方式 2.颜色空间缩减 3.LUT函数:Look up table操作 4.计时函数 5.访问图像中像素的三类方法 5.1.指针访问像素 5.2.迭代器操作像素 5.3. ...

  4. 【OpenCV】OpenCV实战从入门到精通之 -- 指针访问、迭代器iterator、动态地址计算配合at元素

    目录 1.指针访问像素 2.迭代器操作像素 3.动态地址计算 OpenCV中,有三种方式访问图像像素: 指针访问:C操作符[]: 迭代器iterator 动态地址计算 上述方法在访问速度上略有差异.d ...

  5. OpenCV(图像处理)—访问像素的三种方法

    方法一:用指针访问像素 1 #include <opencv2/opencv.hpp> 2 #include <opencv2/core/core.hpp> 3 #includ ...

  6. 颜色缩减 -利用指针、迭代器、动态地址实现访问像素

    为什么要使用颜色缩减 在对单通道图像进行处理时,像素的可能值为256个,但处理多通道时,像素的处理就会相当麻烦,其实用这些颜色中具有代表性的一小部分就可以达到同样的效果,所以颜色空间缩减就可以派上用场 ...

  7. OpenCV精进之路(零):core组件——Mat和IplImage访问像素的方法总结

    在opencv的编程中,遍历访问图像元素是经常遇到的操作,掌握其方法非常重要,无论是Mat类的像素访问,还是IplImage结构体的访问的方法,都必须扎实掌握,毕竟,图像处理本质上就是对像素的各种操作 ...

  8. 【opencv学习笔记】003之图像像素基本操作(获取像素指针、范围处理)及掩膜操作(filter2D)详解

    目录 一.前言 二.图像像素基本操作 1.获取图像像素指针 1.获取图像像素指针是什么? 2.相应API 3.获取目的 2.像素范围处理saturate_cast 1.像素范围处理是什么? 2.像素范 ...

  9. OpenCV访问像素的三种方法

    三种方法分别问: 指针访问:void colorReduce_ptr(cv::Mat &inputImage, cv::Mat &outputImage, int div); 迭代器访 ...

最新文章

  1. 基于Redis的分布式锁和Redlock算法
  2. 基于深度关键点的几何约束摄像机姿态估计
  3. SpringBoot+Vue+Openlayers实现地图上新增和编辑坐标并保存提交
  4. 如何使用Tasklist命令
  5. android代码设置digits,andorid editext android:digits=abcdefghijklmnopqrstuvwxyz用代码写来控制规则该怎么写呢?...
  6. plsql+FileZilla显示乱码问题
  7. LeetCode 01:有人相爱,有人夜里开车看海,有人LeetCode第一题都做不出来
  8. 基础篇——树莓派远程连接工具VNC不显示视频或摄像头画面解决方式
  9. 信号传输速率的快速了解
  10. nginx空白图片 访问打点
  11. minpack.error: Result from function call is not a proper array of floats.
  12. 从给定网页上下载img src= /格式的图片,并保存到制指定路径
  13. Emlog博客主题模板 ZanBlog3 优化版 V4
  14. python爬虫式_Python网络爬虫(增量式爬虫)
  15. MATLAB矩阵复制及扩充
  16. Redis压力测试报告
  17. HTML+CSS+JS网页设计期末课程大作业—— 绿色化妆品HTML+CSS+JavaScript
  18. 基于FPGA的地铁自助售票机设计
  19. qt调试出现 The CDB process terminated异常
  20. 计算机信息管理专业教学改革,计算机信息管理专业教学改革路径论文

热门文章

  1. JAVA jdk8安装
  2. 分布式查询工具-Apache Drill
  3. 设计模式是不是一件脱裤子放屁的事
  4. 如何让公司其他人(同一个局域网)访问自己电脑静态.html
  5. 新绝代双骄3终极全攻略1
  6. 字符和文档识别的四十年研究
  7. 右键新建没有Word怎么办?右键新建添加Word方法!
  8. 13.JVM-垃圾回收相关概念
  9. 台式机:喇叭+麦克风二合一转接头DIY
  10. 阿里开源最大商品图库,为业界提供图像分类测评基准