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,可選擇是否複製資料*/