OpenCV学习:Mat类详细解析+源码剖析(三)遍历矩阵中元素
2013-12-31 10:31
274 查看
本节主要介绍如何遍历Mat数组中的元素,遍历Mat中元素的相关函数,其中包括at族函数和ptr族函数,以及矩阵内存的布局,以及许多C++相关的知识点,这是整个Mat类的精髓,也注定了这将是华丽丽的一篇!
你如何定位矩阵中的元素?
OpenCV Tutorials中给出了三种方法遍历数组中的元素:(一)高效的经典的C运算子[ ]方法;(二)安全的C++中迭代器方法;(三)动态地址计算方法。下面简要介绍下三种方法的主要用法以及优缺点
(一)无人能及的C []运算子,基于ptr函数族
最高效的方法
(二)C++迭代器方法
最安全的方法
(三)动态地址计算方法:主要使用at函数族,千万不要用!
此种方法适合随机访问操作,而并不适合遍历操作。相较于最高效的C方法,这种方法遍历每一个图像元素时都会重新生成一个行指针。稍后会分析方法(一)和方法(三)到底差在哪里。
Tutotials中也给出了上述三种方法的时间对比
所以说,遍历矩阵时,首选方法是方法一。
为什么方法一和方法三会差那么多呢?下面通过分析Mat的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 Way | Iterator | On-The-Fly RA |
79.4717 milliseconds | 83.7201 milliseconds | 93.7878 milliseconds |
为什么方法一和方法三会差那么多呢?下面通过分析Mat的at函数族和ptr函数族回答这个问题。
相关文章推荐
- OpenCV学习:Mat类详细解析+源码剖析(三)遍历矩阵中元素
- OpenCV学习:Mat类详细解析+源码剖析(一)
- OpenCV学习:Mat类详细解析+源码剖析(二)构造函数
- OpenCV学习:Mat类详细解析+源码剖析(四)MSize类和Mstep类
- OpenCv学习笔记(一)--OpenCv中Mat类源码的详细解读(1)
- OpenCV学习——错误的案例:矩阵的遍历赋值和取值
- opencv学习之GaussianBlur()源码解析
- OpenCV对图像或矩阵元素遍历的四种方法
- JUC.Condition学习笔记[附详细源码解析]
- JUC.Lock(锁机制)学习笔记[附详细源码解析]
- opencv学习-Mat类图像遍历
- STL源码剖析学习原因案例解析(二)
- caffe源码深入学习5:超级详细的caffe卷积层代码解析
- OpenCV 立体视觉详细解析(三)---立体标定和校正源码分析
- caffe源码深入学习6:超级详细的im2col绘图解析,分析caffe卷积操作的底层实现
- OpenCV快速遍历矩阵元素方法
- Redis源码剖析和注释(二十二)--- Redis 复制(replicate)源码详细解析
- OpenCv学习笔记(九)再谈OpenCv中Mat类源码的详细解读
- OpenCV图像元素遍历四种方法的源码及性能对比
- 【OpenCV学习】错误的案例:矩阵的遍历赋值和取值