OpenCV学习:Mat类详细解析+源码剖析(三)遍历矩阵中元素
来源:互联网 发布:java 所有数据类型 编辑:程序博客网 时间:2024/05/16 12:03
本节主要介绍如何遍历Mat数组中的元素,遍历Mat中元素的相关函数,其中包括at族函数和ptr族函数,以及矩阵内存的布局,以及许多C++相关的知识点,这是整个Mat类的精髓,也注定了这将是华丽丽的一篇!
你如何定位矩阵中的元素?
(二)C++迭代器方法
(三)动态地址计算方法:主要使用at函数族,千万不要用!
Tutotials中也给出了上述三种方法的时间对比
Efficient WayIteratorOn-The-Fly RA79.4717 milliseconds83.7201 milliseconds93.7878 milliseconds所以说,遍历矩阵时,首选方法是方法一。
为什么方法一和方法三会差那么多呢?下面通过分析Mat的at函数族和ptr函数族回答这个问题。
at函数族和ptr函数族
你如何定位矩阵中的元素?
OpenCV Tutorials中给出了三种方法遍历数组中的元素:(一)高效的经典的C运算子[ ]方法;(二)安全的C++中迭代器方法;(三)动态地址计算方法。下面简要介绍下三种方法的主要用法以及优缺点
(一)无人能及的C []运算子,基于ptr函数族int i,j; uchar* p; for( i = 0; i < nRows; ++i) { p = I.ptr<uchar>(i);//获取行指针 for ( j = 0; j < nCols; ++j) { p[j] = table[p[j]]; } }最高效的方法
(二)C++迭代器方法
MatIterator_<uchar> it, end; for( it = I.begin<uchar>(), end = I.end<uchar>(); it != end; ++it) *it = table[*it]; break;最安全的方法
(三)动态地址计算方法:主要使用at函数族,千万不要用!
for( int i = 0; i < I.rows; ++i) for( int j = 0; j < I.cols; ++j ) I.at<uchar>(i,j) = table[I.at<uchar>(i,j)];此种方法适合随机访问操作,而并不适合遍历操作。相较于最高效的C方法,这种方法遍历每一个图像元素时都会重新生成一个行指针。稍后会分析方法(一)和方法(三)到底差在哪里。
Tutotials中也给出了上述三种方法的时间对比
Efficient WayIteratorOn-The-Fly RA79.4717 milliseconds83.7201 milliseconds93.7878 milliseconds所以说,遍历矩阵时,首选方法是方法一。
为什么方法一和方法三会差那么多呢?下面通过分析Mat的at函数族和ptr函数族回答这个问题。
at函数族和ptr函数族
at函数族:
template<typename _Tp> _Tp& at(int i0=0);template<typename _Tp> const _Tp& at(int i0=0) const; …...template<typename _Tp> _Tp& at(Point pt);template<typename _Tp> const _Tp& at(Point pt) const;ptr函数族:
uchar* ptr(int i0=0);const uchar* ptr(int i0=0) const; …...template<typename _Tp, int n> _Tp* ptr(const Vec<int, n>& idx);template<typename _Tp, int n> const _Tp* ptr(const Vec<int, n>& idx) const;ptr函数典型源码:
inline uchar* Mat::ptr(int y){ return data + step.p[0]*y;}at函数典型源码:
template<typename _Tp> inline _Tp& Mat::at(int i0, int i1){ return ((_Tp*)(data + step.p[0]*i0))[i1];}step.p[0]的解释见:OpenCV学习:Mat类详细解析+源码剖析(四)MSize类和Mstep类
以二维情况为例,ptr返回的是指针(某维度某偏移的起始地址),下图所示,at比ptr更进一步,获得指针后又使用[ ]提取出了数值。上文中方法一和方法三最大差异所在,方法一中一个头指针可以运用于整行数据,但是方法四中每遍历一个元素就要算一次行指针,也就是说方法一中行指针计算了row次,而方法三中行指针计算了row×col次!
- OpenCV学习:Mat类详细解析+源码剖析(三)遍历矩阵中元素
- OpenCV学习:Mat类详细解析+源码剖析(三)遍历矩阵中元素
- OpenCV学习:Mat类详细解析+源码剖析(一)
- OpenCV学习:Mat类详细解析+源码剖析(四)MSize类和Mstep类
- OpenCV学习:Mat类详细解析+源码剖析(二)构造函数
- OpenCv学习笔记(一)--OpenCv中Mat类源码的详细解读(1)
- OpenCv学习笔记(一)----OpenCv中Mat类源码的详细解读(2)
- OpenCv学习笔记(九)再谈OpenCv中Mat类源码的详细解读
- OpenCv学习笔记(九)再谈OpenCv中Mat类源码的详细解读
- OpenCV Mat类矩阵元素访问
- opencv mat元素的遍历
- OpenCV遍历和输出Mat矩阵中数据方法总结
- OpenCV中IplImage, CvMat, Mat 基本使用和元素遍历
- OpenCV中IplImage, CvMat, Mat 基本使用和元素遍历
- OpenCV中IplImage, CvMat, Mat 基本使用和元素遍历
- OpenCV中矩阵类详解之一:Mat
- OpenCV中矩阵类详解之一:Mat
- OpenCV中矩阵类详解之一:Mat
- Findbug编写新的规则
- 架构师不可不知的十大可扩展架构
- android mediaplayer 1
- listView当选中上下滑动的时候背景是白色的
- 数据库表的设计原则
- OpenCV学习:Mat类详细解析+源码剖析(三)遍历矩阵中元素
- 64bit ubuntu 12.04 firefox plugin目录
- 第十三次课后作业
- 移植Matlab的底层模糊逻辑控制库(C语言)
- Android SDK Manager无法安装和安装慢的解决
- 好强大的学习资料
- Linux学习笔记1
- S3C2440之GPIO
- C 语言大小端模式判断