OpenCV中Mat、cvMat和IplImage類型轉換

轉載至《圖像處理編程實例》,朱偉編著。

OpenCV2.X中圖像容器一般有Mat、CvMat和IplImage,Mat是一個多維的密集數據數組,常用於進行計算性較高的矩陣、圖像、直方圖操作等。cvMat和IplImage是OpenCV1.x中提供的基於C語言版本的圖像數據容器,側重於圖像數據本身的處理性能。在實際應用場景中,我們常常需要將不同的參數類型進行相互轉換。

1、Mat轉換爲IplImage類型和CvMat類型

cv::Mat img;
CvMat cvMatImg = img;
IplImage IplImg = img;

需要注意的是,轉換後Mat,IplImage和CvMat共享圖像矩陣數據,傳遞的是矩陣頭,並不複製數據,IplImage和CvMat就沒有引用計數功能,如果上述代碼中的img的數據被釋放,cvMatImg和IplImage也就失去了相應數據。因此在進行上述轉換後對IplImage和CvMat對象進行操作時,一定不能將轉換前的Mat對象提前釋放。

2、IplImage類型和CvMat類型轉換爲Mat類型

IplImage *IplImg = cvLoadImage("fruits.jpg");
Mat img(IplImage, ture);

OpenCV2.x中提供Mat類兼容OpenCV1.x中IplImage和CvMat的兩個構造函數:Mat::Mat(const CvMat* m, bool copyData = false)和Mat::Mat(const IplImage* img, bool copyData = false)。如果copyData的值是false,那麼Mat將與IplImage或CvMat共用同一矩陣數據;如果copyData的值是true,Mat會新申請內存空間,然後將IplImage或CvMat的數據複製到Mat的數據區。

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