最近需要使用到Mat和IplImage互相轉換,可是看了網路上許多人的文章,都只是互相複製貼上而已,完全無法解決我的問題,自行研究後找到方法了!
P.S.使用OpenCV 2
這裡會示範四種轉換的方式,並且在轉換後顯示出來
- IplImage* To Mat*
- IplImage* To Mat
- Mat To IplImage
- Mat To IplImage*
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
string fileName = { "D:/birthday.jpg" };//要載入的圖片路徑和檔名
// IplImage* To Mat*,但是這個方式並不安全,偶爾會出現寫入存取違規的錯誤
IplImage *img1 = cvLoadImage(fileName.c_str());//由於參數必須為char[],於是將string轉型
Mat* mat1 = new Mat[0];
mat1[0] = cvarrToMat(img1);
imshow("IplImage* to Mat*", mat1[0]);//顯示圖片
waitKey(0);//延遲,建議參數時間延長或者設置為0讓圖片繪製完畢。0的意思為等待使用者按下任意鍵才往下執行
destroyWindow("IplImage* to Mat*");//關閉名為 IplImage* to Mat* 的視窗
// IplImage* To Mat
IplImage *img2 = cvLoadImage(fileName.c_str());//由於參數必須為char[],於是將string轉型
Mat mat2 = cvarrToMat(img2);
imshow("IplImage* to Mat", mat2);//顯示圖片
waitKey(0);//延遲,建議參數時間延長或者設置為0讓圖片繪製完畢。0的意思為等待使用者按下任意鍵才往下執行
destroyWindow("IplImage* to Mat");//關閉名為 IplImage* to Mat 的視窗
// Mat to IplImage
Mat mat3 = imread(fileName, CV_LOAD_IMAGE_COLOR);//有兩個參數,第一個參數為圖片檔案路徑(string)、第二個參數為影像格式,預設為CV_LOAD_IMAGE_COLOR。詳情可查看 imgcodes_c.h
IplImage img3 = IplImage(mat3);
imshow("Mat to IplImage", mat3);//顯示圖片
waitKey(0);//延遲,建議參數時間延長或者設置為0讓圖片繪製完畢。0的意思為等待使用者按下任意鍵才往下執行
destroyWindow("Mat to IplImage");//關閉名為 Mat to IplImage 的視窗
// Mat to IplImage*
Mat mat4 = imread(fileName, CV_LOAD_IMAGE_COLOR);//有兩個參數,第一個參數為圖片檔案路徑、第二個參數為影像格式,預設為CV_LOAD_IMAGE_COLOR。詳情可查看 imgcodes_c.h
IplImage *img4 = &IplImage(mat4);
imshow("Mat to IplImage*", mat4);//顯示圖片
waitKey(0);//延遲,建議參數時間延長或者設置為0讓圖片繪製完畢。0的意思為等待使用者按下任意鍵才往下執行
destroyWindow("Mat to IplImage*");//關閉名為 Mat to IplImage* 的視窗
return 0;
}