1. 程式人生 > >Mat 資料結構

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)