最近频繁地在使用OpenCV的Mat图像格式和IplImage图像格式,所以记录一下他们的一些使用区别。
首先贴出来互相转换的方法:
Mat转IplImage如下:
//浅拷贝
Mat mat_Image = imshow("1.bmp");
IplImage image = cvIplImage(mat_Image);
//深拷贝
IplImage* temp;
//temp = cvCreateImage(cvSize(mat_Image.rows, mat_Image.cols), 8, 1);//灰度图
temp = cvCloneImage(&image);
IplImage转Mat如下:
IplImage* src=cvLoadImage("temp.jpg");
Mat ImgTemp;
ImgTemp=cvarrToMat(src);//浅拷贝
Mat Img = ImgTemp.clone();//利用clone()再次深拷贝
加载的方法的区别
//Mat的加载方法
//第一个参数代表图片路径和名称,第二个参数代表0-》灰度加载、1-》彩色加载
Mat mat = imread("1.bmp", 0);
//IplImage的加载方法
IPlImage *Image = cvLoadImage("1.bmp",0);
设置窗口大小和显示
//Mat的图片只能用imshow()来显示
Mat mat = imread("1.bmp", 0);
namedWindow("mat",0); //第二个参数 0-》窗口可以自定义大小、1-》自适应图片大小
resizeWindow("mat",800,600);
imshow("mat", mat);
//IplImage的图片只能用cvShowImage()来显示
IPlImage *Image = cvLoadImage("1.bmp",0);
cvNamedWindow("Image", 0);
cvResizeWindow("Image", cvSize(1200, 900));
cvShowImage("Image", Image);
/*
备注:无论是namedWindow和cvNamedWindow,还是resizeWindow和cvResizeWindow,
用法和效果是一样的,对于窗口的操作不分图片格式。
*/
有坑记录
cvNamedWindow,cvShowImage与多线程的问题
当在子线程中调用cvShowImage,会出现窗口无响应无显示的现象,无论是否在子线程中提前调用cvNamedWindow。
而在主线程中提前调用cvNamedWindow,后在子线程中调用cvShowImage则显示正常。
若在子线程调用cvShowImage前关闭cvNamedWindow产生的窗口,同样会造成窗口无响应无显示。
参考链接:https://blog.csdn.net/qwertyuj/article/details/7406456