1. 程式人生 > >OpenCV 中影象處理類,Mat類和Ipllmage類

OpenCV 中影象處理類,Mat類和Ipllmage類

 Mat類是OpenCV 中最核心的類,全稱是Matrix,意為矩陣或者陣列的意思,該類的宣告在標頭檔案opencv2\core\core.hpp中, 

 Mat 類的建構函式如下:

 Mat(int rows,int cols,int type)

 其中rows代表矩陣的行數,cols代表矩陣的列數,type代表型別,包括通道數及其資料型別,可以設CV_8UC(n),CV_8SC(n),CV_16SC(n),CV_16UC(n),CV_32UC(n),CV_32FC(n),CV_64FC(n),8U,8S,16U,16S,32S,32F,64F前面的數字代表Mat中的每一個數值所佔的bit數,而1byte=8it,所以,32F就是佔4位元組的float型別,64F是佔8位元組的double型別,32S是佔4位元組的int型別,8U是佔1位元組的ucharl型別,當n=1時,即構造單通道矩陣或稱二維矩陣,當n>1時,即構造多通道矩陣即三維矩陣,直觀上就是n個二維矩陣組成的三維ndarray是等價的。對於Mat建構函式也可以採用以下形式:

 Mat(Size(int cols,int rows), int type)

 其中使用了OpenCV的Size類,該類一般用來儲存矩陣的列數和行數,在這裡應該注意的是,Size的第一個元素是矩陣的列數(寬),第二個元素是矩陣的行數(高),即先存寬,再存高,與ndarray的shape相反。

(1)構造單通道Mat物件

  構造2行3列float型別的單通道矩陣:

 #include<opencv2/core/core.hpp>

 using namespace cv;

 int main()

 {  

    Mat m=Mat(2,3,CV_32FC(1));

    return 0;

 }

 也可以直接藉助Size物件,程式碼如下:

 Mat m=Mat(Size(3,2),CV_32FC(1));

(2)IplImage結構體

由於OpenCV主要針對的是計算機視覺方面的處理,因此在函式庫中,最重要的結構體是IplImage結構。IplImage結構來源於Intel的另外一個函式庫Intel Image Processing Library (IPL),該函式庫主要是針對影象處理。IplImage結構具體定義如下:

typedef struct _IplImage

    {

        int nSize;         // IplImage大小 

        int ID;            //版本 (=0)

        int nChannels;     //大多數OPENCV函式支援1,2,3 或 4 個通道 

        int alphaChannel; // 被OpenCV忽略 

        int depth;         //畫素的位深度

        char colorModel[4]; //被OpenCV忽略 

        char channelSeq[4]; //被OpenCV忽略

        int dataOrder;     //0 - 交叉存取顏色通道, 1 - 分開的顏色通道.只有cvCreateImage可以建立交叉存取影象 

        int origin;        //影象原點位置: 0表示頂-左結構,1表示底-左結構 

        int align;         //影象行排列方式 (4 or 8),在 OpenCV 被忽略,使用 widthStep 代替 

        int width;        //影象寬畫素數 

        int height;        //影象高畫素數

        struct _IplROI *roi; //影象感興趣區域,當該值非空時,只對該區域進行處理 

        struct _IplImage *maskROI; //在 OpenCV中必須為NULL 

        void *imageId;    //在 OpenCV中必須為NULL

        struct _IplTileInfo *tileInfo; //在 OpenCV中必須為NULL

        int imageSize;     // 影象資料大小(在交叉存取格式下ImageSize=image->height*image->widthStep),單位位元組

        char *imageData;    //指向排列的影象資料 

        int widthStep;     // 排列的影象行大小,以位元組為單位 

        int BorderMode[4]; //邊際結束模式, 在 OpenCV 被忽略

        int BorderConst[4]; //  邊際結束模式, 在 OpenCV 被忽略

        char *imageDataOrigin; /* 指標指向一個不同的影象資料結構(不是必須排列的),是為了糾正影象記憶體分配準備的 */

    } IplImage;

IplImage結構體是整個OpenCV函式庫的基礎,在定義該結構變數時需要用到函式cvCreatImage,變數定義方法如下:

IplImage* src="/cvCreateImage"(cvSize(400,300), IPL_DEPTH_8U,3);

上句定義了一個IplImage指標變數src,影象的大小是400×300,影象顏色深度8位,3通道影象。

Mat型別和IpIImage型別之間的相互轉換

(1)IplImage -> Mat


Mat::Mat(const IplImage* img, bool copyData=false);/*default copyData=false,與原來的IplImage共享資料,只是建立一個矩陣頭*/
例子:
IplImage* iplImg = cvLoadImage("greatwave.jpg", 1);
Mat mtx(iplImg); /* IplImage * -> Mat,共享資料; or : Mat mtx = iplImg;*/

(2) Mat -> IplImage


Mat M
IplImage iplimage = M; /*只建立影象頭,不復制資料*/

CvMat -> Mat
Mat::Mat(const CvMat* m, bool copyData=false); /*類似IplImage -> Mat,可選擇是否複製資料*/