Mat 数据结构

介绍

  • 历史:OpenCV从2001年开始发展,在最初使用的是c语言,使用的是IplImage数据结构来存储图像,但是最大的问题需要手动申请释放内从( manual memory management),从OpenCV2.0开始,开始使用C++接口的Mat,这是自动分配和释放内存的(automatic memory management)。

  • Mat有两部分组成
  1. 头部:存储方式、图像大小等信息,头部的大小是一个常量(constant)
  2. 数据块:图像像素的值

NOTE1:大部分拷贝Mat,如拷贝构造、赋值操作,只是拷贝头部信息,他们指向同一个数据块,不同对象对其做操作,会影响到其他对象。如果想进行深拷贝用cv::Mat::copyTo 和cv::Mat::clone 方法

Mat F = A.clone();
Mat G;
A.copyTo(G);

NOTE2:有多个头部指向同一个Matrix,那么谁来对其进行销毁:最后一个使用的对象,OpenCV内部有引用的计数机制 (reference counting mechanism),当增加一个对象(只复制一个头部指向Matrix)counter+1;如果一个对象销毁,counter-1。最后一个对象对Matrix进行回收。


  • 存储方式
  1. 彩色RGB,注意OpenCV存储顺序是BGR
  2. HSV(色调、饱和度和值) and HLS(色调、亮度和饱和度):(hue, saturation and value/luminance)
  3. YCrCb:JPEG格式使用
  4. CIELab:测量颜色和颜色之间的距离时使用方便

  • Mat 的常见构造(详细见Mat类
  1. Mat M(2,2, CV_8UC3, Scalar(0,0,255)); //也可以不进行初始化
  2. Mat M(cv::Size(320,240),CV_8UC3, Scalar(0,0,255));//也可以不进行初始化
  3. image.create (int rows, int cols, int type) /create (Size size, int type)

猜你喜欢

转载自blog.csdn.net/zzyczzyc/article/details/84307052
Mat
今日推荐