opencv中,幾種常見的圖像類型有:html
IplImage,Mat,CvMat,CvArr ide
CvArr :函數
老版本的結構了。是一個抽象基類,在函數原型中,常見到CvArr(CvArr*),這就容許吧CvMar* 或者IplImage* 傳遞到程序或函數參數中了。ui
CvMat :編碼
矩陣結構,spa
IplImage :指針
是較老版本的一種類型了,對圖像進行」編碼「的基本結構。這些圖像多是灰度,彩色,4通道的(RGB+ alpha),其中,每一個通道能夠包含任意的整數或浮點數。code
Mat:htm
新版本中的強大的一個圖像容器,是和Matlab中的函數對應的。基本上講 Mat 是一個類,由兩個數據部分組成:矩陣頭(包含矩陣尺寸,存儲方法,存儲地址等信息)和一個指向存儲全部像素值的矩陣(根據所選存儲方法的不一樣矩陣能夠是不一樣的維數)的指針。矩陣頭的尺寸是常數值,但矩陣自己的尺寸會依圖像的不一樣而不一樣,一般比矩陣頭的尺寸大數個數量級。blog
Mat::Mat(const IplImage* img, bool copyData=false);
默認狀況下,新的Mat類型與原來的IplImage類型共享圖像數據,轉換隻是建立一個Mat矩陣頭。當將參數copyData設爲true後,就會複製整個圖像數據。
例:
IplImage*iplImg = cvLoadImage("greatwave.jpg", 1);
Matmtx(iplImg); // IplImage* ->Mat 共享數據
// or : Mat mtx = iplImg;
一樣只是建立圖像頭,而沒有複製數據。
例:
IplImage ipl_img = img; // Mat -> IplImage
與IplImage的轉換相似,能夠選擇是否複製數據。
Mat::Mat(const CvMat* m, bool copyData=false);
與IplImage的轉換相似,不復制數據,只建立矩陣頭。
例:
// 假設Mat類型的imgMat圖像數據存在
CvMat cvMat = imgMat; // Mat -> CvMat
爲矩陣定義了一系列方便的操做符。咱們能夠將一個已經存在的灰度圖像 img 變成全黑色:
img = Scalar(0);
選擇感興趣區域:
Rect r(10, 10, 100, 100);Mat smallImg = img(r);
將 Mat 轉爲 C API 數據類型:
Mat img = imread("image.jpg");IplImage img1 = img;CvMat m = img;
注意此處無數據複製操做。
將彩色圖像轉爲灰度圖像:
Mat img = imread("image.jpg"); // loading a 8UC3 imageMat grey;cvtColor(img, grey, CV_BGR2GRAY);
將圖像的類型從8UC1轉爲32FC1:
src.convertTo(dst, CV_32F);
仍是要多參考,多用,映像才深入
http://www.cnblogs.com/zcftech/archive/2013/04/10/3013027.html
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_mat.html#id6