CvMat, Mat, IplImage, Cvarr類型

CvMat, Mat, IplImage, Cvarr 元素的獲取和類型轉換。

參考 http://blog.csdn.net/abcjennifer/article/details/17640195


1、四者關係:

1).CvMat(CvMat is now obsolete, consider using Mat instead)不建議用;

2). 派生關係:CvArr -> CvMat -> IplImage

3). Mat是C++接口,和IplImage有所不同。



2. 相互轉換


1). Mat與IplImage相互轉換

IplImage* src;

某文章說,轉換應該是Mat m(src); 而這不會複製內容,真正能複製內容的是:


Mat -> IplImage:

  1. Mat m;  
  2. IplImage* transIplimage = cvCloneImage(&(IplImage) m);  

IplImage -> Mat

  1. IplImage* transIplImage;  
  2. Mat m = cvarrToMat(transIplImage,true);  

2). CvMat與IplImage相互轉換

  1. IplImage* transIplImage;  
  2. CvMat* cvmat;  
  3. cvGetMat(transIplImage,cvmat);  
  4. cvGetImage(cvmat,transIplImage);  


3. (多通道)Mat, IplImage, CvMat的元素獲取

單通道的網上很多,這裏只寫多通道:

1). IplImage

  1. //i is the index of rows  
  2. //j is the index of cols  
  3. //c is the index of channel  
  4. ((uchar*)pImg->imageData+i*pImg->widthStep)[j*3+c]  
  5. CV_IMAGE_ELEM(pImg,uchar,i,3*j+c)   

2 ).Mat

  1. Mat m;  
  2. int h = m.rows; int w = m.cols;  
  3. int nc = m.channels();    
  4. for (int i = 0;i<h;i++)  
  5. {  
  6.     for(int j = 0;j<w;j++)  
  7.     {  
  8.         Vec3b& elem = m.at<Vec3b>(i,j);  
  9.         for (int c = 0; c<nc; c++)  
  10.         {  
  11.             uchar uc = elem[c] ;//Mat(i,j) of channel c  
  12.         }  
  13.     }  
  14. }  

3). CvMat

CV_MAT_ELEM(cvmat,uchar,i,3*j+c) 


4. 驗證獲取元素代碼(Mat轉IplImage)

此代碼只用於驗證多通道元素獲取沒有錯誤,具體用的時候最好還是用opencv直接給的吧(見第3小節)

  1. IplImage* cvcvt_mat2IplImage(Mat m)  
  2. {  
  3.     int h = m.rows; int w = m.cols;  
  4.     int nc = m.channels();  
  5.     IplImage* pImg = cvCreateImage(cvSize(w,h),8,nc);  
  6.       
  7.     for (int i = 0;i<h;i++)  
  8.     {  
  9.         for(int j = 0;j<w;j++)  
  10.         {  
  11.             Vec3b& elem = m.at<Vec3b>(i,j);  
  12.             for (int c = 0; c<nc; c++)  
  13.             {  
  14.                 //以下兩種都可以  
  15.                 //((uchar*)pImg->imageData+i*pImg->widthStep)[j*3+c] =  elem[c];  
  16.                 CV_IMAGE_ELEM(pImg,uchar,i,3*j+c) = elem[c];  
  17.             }  
  18.         }  
  19.     }  
  20.     return pImg;  
  21. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章