openCV2 的精髓——深入讲解Mat原理(非如何使用)

  前言 

      一直觉得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对象.

   

你可能感兴趣的:(【OpenCV】)