OpenCV 基礎- Mat IplImage 最近用到的一些轉換 以及初始化

Mat 這個opencv2.0改版後,提出的結構由於會自己維護內存,基本不需要手動去將分配的空間釋放,因此及其易用。
不過有的函數,在以前的版本中存在,而在新版中沒有後續維護,那麼就需要將Mat轉換成IplImage去運算,然後轉換回來。
一般的轉換是:
Mat gray_src;
……
IplImage pImg= IplImage(gray_src);
IplImage * pImg_gray = &pImg;
發現源代碼中最簡單的代碼是在需要的地方直接使用:
 &IplImage(gray_src)
不過如果是跨平臺,則有點編譯器不接受這樣的解析方式,那就要用上面的兩行代碼了。
做完運算後,可以用:
Mat gray_result(pImg_gray);
來獲得對應的Mat類型。不過他們都是共用同一塊內存的,所以你之後對pImg_gray做操作,gray_result也會發生改變。那麼可以用拷貝構造的方法:
Mat gray_result(pImg_gray,1);
如果從另外一個Mat類型進行拷貝構造,則如下:
Mat img_fl_befor = img_fl.clone();

經常要對Mat進行初始化,
如果想建立一個和res圖像一樣大小,depth爲1的圖像,可以用
Mat img_detail = Mat::zeros(res.rows, res.cols, CV_8UC1);
將圖像初始化爲0;
如果想要一個初始化背景爲白色,也就是每個通道都是255的圖像,則
 Mat mask_fl( img.rows, img.cols, CV_8UC1, Scalar::all(255) );
再如果,我們不想要白色,也不想要黑色的背景,而是想要某張圖上某個像素點的顏色作爲背景,這裏直接用了以前的cvGet2D函數,獲取img_src上座標

爲(1,1)點的像素值:
Mat img_result = Mat(dsize.height,dsize.width,img_src.type(),cvGet2D(&IplImage(img_src),1,1));

如果想要從圖像中拷貝一部分到另外一部分:
拷貝矩形 很簡單 ,從背景上選取一塊和目標一樣大小的矩形,然後將原圖拷過去。 這裏的img_src 我已經處理過,就是我選出來的目標。
其實 我這裏實現的不僅僅是拷貝矩形目標,非矩形目標也可以成功提取到另外的簡單背景中,而且不需要提取輪廓哦。嘿嘿 看明白沒有呢。
Rect roi(x, y, img_src.cols, img_src.rows);//cols 對應w rows 對應h
Mat roi_of_image = img_result(roi);
img_src.copyTo(roi_of_image);

PS:
CvMat, Mat, IplImage之間的互相轉換
IpIImage -> CvMat

CvMat matheader;
CvMat * mat = cvGetMat(img, &matheader);

CvMat * mat = cvCreateMat(img->height, img->width, CV_64FC3);
cvConvert(img, mat)

IplImage -> Mat
Mat::Mat(const IplImage* img, bool copyData=false);
例子:
IplImage* iplImg = cvLoadImage("greatwave.jpg", 1);
Mat mtx(iplImg);
 
Mat -> IplImage
Mat M
IplImage iplimage = M;
CvMat -> Mat
Mat::Mat(const CvMat* m, bool copyData=false);
Mat -> CvMat
例子(假設Mat類型的imgMat圖像數據存在):
CvMat cvMat = imgMat;/*Mat -> CvMat, 類似轉換到IplImage,不復制數據只創建矩陣頭

Mat mat(3,4,CV_32FC2); 
int channel = mat.channels(); 
mat.at<float>(1,1 * channel + 1) = 3;  // 第1行第1列第1通道的元素,通道從0開始計數  
mat.at<float>(i,j * channel + k);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章