openCV2 的精髓——深入讲解Mat原理(非如何使用)
来源:互联网 发布:自学javascript要多久 编辑:程序博客网 时间:2024/06/05 00:59
前言
一直觉得OpenCV最牛逼的地方其实是图像数据的定义与存取使用,而在2.0中,Mat可以说是重中之重, 只有理解了Mat,才算理解了图像处理的原理、存储和使用.
看了网上很多人都只是对Mat的数据结构做了翻译或者对如何使用做了简单的描述,说白了,就是讲源文件中的注释翻译了一遍.
但有多少人能说出Mat和IplImage的不同?估计还是很多的,那有多少人能说出为什么在使用中从来没有用Mat做指针的,但是IplImage的使用就基本上是使用指针的(IplImage*)?Mat为什么不需要释放,可以自动分配内存?等等.
Mat和IplImage的不同
从源文件定义中不难发现,Mat的数据结构是一个class, 而IplImage是一个结构体,显而易见,Mat是C++的产物,所以它可以有很多的构造方法和析构函数,也可以有很多的操作方法.
同样,C++的其中一个比C进步的地方就在于它对内存的管理,所以Mat基于C++的策略显得非常的明智.
Mat和IplImage*
这个问题其实我困惑了很久,就是Mat为什么很少使用指针来初始化,而IplImage却总是使用指针来初始化,在网上搜索了很久也机会没有人提出相应的疑问,于是尝试自己去解答.
首先,虽然大家的共识是Mat不必再手动地为其开辟空间,并且在不需要时可以立即将空间释放, 但是,手动地做也是可以的,大多数OpenCV函数仍然会手动地位输出函数开辟空间.当传递一个已经存在的Mat对象时,开辟好的矩阵空间会被重用,我们每次都是用大小正好的内存来完成任务.
让我们再看看Mat的初始函数
inline void Mat::initEmpty(){ flags = MAGIC_VAL; dims = rows = cols = 0; data = datastart = dataend = datalimit = 0; refcount = 0; allocator = 0;}
//! custom allocator MatAllocator* allocator;
由此,可以看到在初始化Mat的时候,Mat已经时刻准备着开辟空间,并且本质上已经开辟了,所以,用指针开辟其实意义不大,所以,其实可以尝试去理解Mat是一个void* 指向一个Mat对象.
0 0
- openCV2 的精髓——深入讲解Mat原理(非如何使用)
- 学习OpenCV2——访问Mat图像的像素值
- 学习OpenCV2——Mat之通道的理解
- opencv2-mat的特点
- 学习OpenCV2——Mat之数据结构
- OpenCV2基础知识——Mat结构
- opencv2-基础图像容器Mat类的使用
- C++的精髓——虚函数原理
- 从OpenCV2的Mat说起
- 学习OpenCV2——Mat之矩阵和数组的运算
- OpenCV2入门——core组件之Mat详解
- OpenCV2:Mat
- OpenCV2:Mat
- OpenCV2:Mat
- OpenCV2:Mat
- OpenCV2:Mat
- OpenCV2:Mat
- opencv2学习(五)——reshape函数的使用
- Oracle常用常考集合
- Eclipse打开java文件
- 多张图片合成一张图片(alpha混合)
- qstringlist 迭代风格
- xml
- openCV2 的精髓——深入讲解Mat原理(非如何使用)
- 我与C++设计模式(二十一)——迭代器模式
- Linux中的shift命令
- 【胡逼蛋砍】——上
- Add Binary
- 输入时间,输入下一秒时间
- html中怎么将标签左对齐,而文本框右对齐的方法
- struts学习之入门级
- Merge Two Sorted Lists