Mat,cvMat和IplImage的相互转换方法
由于opencv内即有c也有c++函数,然后有些函数只支持c++,所以必须对数据类型进行转换,这样才能作为参数引用
IplImage《-------cvClone函数-------》cvMat
cvMat、IplImage----cv::cvarrToMat函数-------》Mat
Mat ----(Mat类型变量).operator CvMat() 或者(Mat类型变量)..operator IplImage()函数-------》cvMat、IplImage
代码如下:
#include "cv.h"
#include "highgui.h"
#include <string>
#include <stdio.h>
#pragma comment(lib, "G:\\OpenCV-2.1.0\\vc2008\\lib\\cxcore210d.lib")
#pragma comment(lib, "G:\\OpenCV-2.1.0\\vc2008\\lib\\cv210d.lib")
#pragma comment(lib, "G:\\OpenCV-2.1.0\\vc2008\\lib\\highgui210d.lib")
using namespace cv;
void main()
{
IplImage * Image=cvLoadImage("lena.jpg",-1);
cvShowImage("IplImage",Image);
//IplImage转换CvMat
CvMat *IplImage2CvMat=(CvMat*)cvClone(Image);//复制Image的数据,直接创建CvMat类型的IplImage2CvMat
cvShowImage("IplImage2CvMat",IplImage2CvMat);
//CvMat转换IplImage
IplImage * CvMat2IplImage=(IplImage *)cvClone(IplImage2CvMat);//复制CvMat的数据,直接创建Image类型
cvShowImage("CvMat2IplImage",CvMat2IplImage);
//CvMat转换Mat
Mat CvMat2Mat=cv::cvarrToMat(IplImage2CvMat,false);//不能将copyData=true,否则会提示出错,具体不明
cv::imshow("CvMat2Mat",CvMat2Mat);
//Mat转换CvMat
Mat IplImage2Mat=cv::cvarrToMat(Image,false);//不能将copyData=true,否则会提示出错,具体不明
cv::imshow("IplImage2Mat",IplImage2Mat);
////Mat转换到IplImage,同时创建新存储单元存储,IplImage * Mat2IplImage=cvCloneImage(&(CvMat2Mat.operator IplImage()));
///也可以直接IplImage * Mat2IplImage=&(CvMat2Mat.operator IplImage());这样就可以和Mat共享原来的存储空间
IplImage * Mat2IplImage=cvCloneImage(&(CvMat2Mat.operator IplImage()));
cvShowImage("Mat2IplImage",Mat2IplImage);
////Mat转换到CvMat,同时创建新存储单元存储,CvMat * Mat2CvMat=cvCloneMat(&(CvMat2Mat.operator CvMat()));
///也可以直接CvMat * Mat2CvMat=&(CvMat2Mat.operator CvMat());这样就可以和Mat共享原来的存储空间
CvMat * Mat2CvMat=cvCloneMat(&(CvMat2Mat.operator CvMat()));
cvShowImage("Mat2CvMat",Mat2CvMat);
cvReleaseMat(&IplImage2CvMat);//不能释放,具体不明
cvReleaseImage(&Image);
cvReleaseImage(&CvMat2IplImage);
cvReleaseImage(&Mat2IplImage);
cvReleaseMat(&Mat2CvMat);
CvMat2Mat.release();
IplImage2Mat.release();
cvWaitKey(0);
}