Pages

2009年12月15日 星期二

cv::Mat 與 IplImage 之間的轉換

「OpenCV 1.1pre」版本開始對以前的 API,以 c++ 包裝,定義成 namespace cv,這意味著想寫 c-style 或 c++ style 的程式皆可。所以,在處理影像的部份,就有「cv::Mat」和「IplImage」,至於該如何轉換,請看以下程式碼片段:

IplImage -> cv::Mat
IplImage* iplImg = cvLoadImage("lena.jpg");
cv::Mat cvMatImg(iplImg, 0);
cv::imshow("cv::Mat Show", cvMatImg);

cv::Mat -> IplImage
IplImage iplImg2;
iplImg2= IplImage(cvMatImg);
cvShowImage("IplImage2 Show", &iplImg2);
在第一個範例中,我們可以看到 cv::Mat 的建構子有兩個參數,比較重要的是第二個參數,如果設定成 0,代表不複製影像,也就是兩個變數的 row data 共用同個記憶體位置,header 則各自有。

接著,第二個範例,從第二行可以看到 cv::Mat 呼叫成員函式 operator IplImage(),至於行為上就沒得選擇,一定是 row data 共用同個記憶體位置,header 各自有。

底下是 operator IplImage() 的實作內容,定義在 cxmat.hpp;類別則宣告在 cxcore.hpp...
inline Mat::operator IplImage() const
{
IplImage img;
cvInitImageHeader(&img, size(), cvIplDepth(flags), channels());
cvSetData(&img, data, (int)step);
return img;
}

1 則留言:

Unknown 提到...
作者已經移除這則留言。
 
Blogger Templates