openCV学习笔记(9)Mat与IplImage,CvMat类型之间转换

opencv中图像数据容器一般有Mat,cvMat和IplImage。我们在平常的代码中,由于不同的函数的参数类型不一致,经常需要转换这三者之间的相互转化。网上有大量的杂七杂八的资料,望结合实际而用之。

Mat是一个多维的密集数据数组,可以用来处理向量和矩阵、图像、直方图等等常见的多维数据,所以Mat侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。

而CvMat和IplImage类型更侧重于“图像”,opencv对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。

(1)将IplImage类型转换到Mat类型

Mat::Mat(const IplImage* img, bool copyData=false);

默认情况下,新的Mat类型与原来的IplImage类型共享图像数据,转换只是创建一个Mat矩阵头。当将参数copyData设为true后,就会复制整个图像数据

用代码可以验证何谓"共享图像数据"

#include <iostream>
#include <highgui.h>

using namespace std;
using namespace cv;

int main()
{
	//IplImage->Mat

	IplImage *image = cvLoadImage("I:\\OpenCV Learning\\picture\\sumpalace.jpg");
	//显示IplImage图像
	cvShowImage("IplImage_image0",image);
	//转换容器类型,从IplImage->Mat
	Mat matImage = Mat(image,false);
	//显示Mat图像
	imshow("Mat_image0",matImage);
	//更改<span style="font-family:宋体;">mat</span>图像的数据:在图像中画一个圆
	circle(matImage,cvPoint(100,100),64,Scalar(0,0,255),1,1,1);
	//显示IplImage图像和Mat图像
	cvShowImage("IplImage_image1",image);
	imshow("Mat_image1",matImage);

	waitKey(0);

	return 0;
}

观察结果:更改mat图像数据后,IplImage图像的数据也会更改,二者使用的数据是同一数据,此乃共享。

(2)将Mat类型转换到IplImage类型

Mat matImage;
IplImage IplImage_image = matImage;

同样是共享图像数据,只是创建了图像头,不复制数据。

(3)将CvMat类型转换为Mat类型

Mat::Mat(const CvMat* m, bool copyData=false);

类似IplImage -> Mat,可选择是否复制数据

(4)将Mat类型转换为CvMat类型

Mat matImage;
CvMat cvMatImage = matImage; 

同样是共享图像数据,只是创建了图像头,不复制数据。

时间: 2024-08-25 13:32:58

openCV学习笔记(9)Mat与IplImage,CvMat类型之间转换的相关文章

opencv中Mat与IplImage,CVMat类型之间转换

opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型较CvMat和IplImage有更强的矩阵运算能力,支持常见的矩阵运算(参照Matlab中的各种矩阵运算),所以将IplImage类型和CvMat类型转换为Mat类型更易于数据处理. Mat类型可用于直接存储图像信息,通过函数imread.imwrite.imshow等实现(与Matlab中的函数相

OpenCv学习笔记(四)--Mat基本图像容器Mat对象信息头,矩阵体的创建,深复制,浅复制详解

1--我们知道Mat是一个图像容器类,这个数据结构由两部分组成: 1--矩阵头--即class Mat类所实例化的类对象所开辟的空间里面存储的数据---就是这个矩阵的信息,当我们以 Mat object;这样声明类对象的时候,也仅仅是创建了一个Mat的信息头,并没有创建矩阵体,也就是说,我们并 没有给将要存储的图像开辟相应的空间 2--矩阵头--包含: 1--矩阵的尺寸----比如---class Mat这个类中的----数据成员rows,cols---就可以指定图像的尺寸 2--存储方法---

OpenCV学习笔记 cv.Mat 与 .txt 文件数据的读写操作

http://blog.csdn.net/chenyusiyuan/article/details/7974378

iOS学习笔记(4)@property和类型之间用括号添加一些额外的指示符的作用

当使用@property定义property时,还可在@property和类型之间用括号添加一些额外的提示符,可使用的特殊指示符如下 · assign:该指示符指定对属性只是进行简单赋值,不更改对所赋的值的引用计数.这个指示符主要适用于NSInteger等基础类型,以及short.float.double.结构体等各种C数据类型. 提示:引用计数是Objective-C内存回收的概念,当一个对象的引用计数大于0时,表明该对象还不应该被回收,由于NSInteger等基础类型,以及short.flo

opencv学习笔记(七)SVM+HOG

opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和统计图像局部区域的梯度直方图来构成特征.Hog特征结合SVM分类器已经被广泛用于图像识别中,尤其在行人检测中获得了极大的成功.需要提醒的是,HOG+SVM进行行人检测的方法是法国研究院Dalal在2005的CVPR上提出的. 最近在做车标识别相关的研究,用到了SVM+HOG的方法进行识

Opencv学习笔记(六)SURF学习笔记

原创文章,转载请注明出处:http://blog.csdn.net/crzy_sparrow/article/details/7392345 本人挺菜的,肯定有非常多错误纰漏之处 ,希望大家不吝指正. 看了harris角点检測之后,開始研究SURF角点检測,发现挺复杂的,一时也仅仅了解了大概,把了解的东西总结下,以便下次深入学习. SURF角点检測算法是对SIFT的一种改进,主要体如今速度上,效率更高.它和SIFT的主要差别是图像多尺度空间的构建方法不同. 在计算视觉领域,尺度空间被象征性的表述

opencv学习笔记(四)投影

opencv学习笔记(四)投影 任选了一张图片用于测试,图片如下所示: 1 #include <cv.h> 2 #include <highgui.h> 3 using namespace std; 4 using namespace cv; 5 int main() 6 { 7 IplImage * src = cvLoadImage("cat.png", 0); //强制转化读取图像为灰度图 8 cvShowImage("灰度图像", s

OpenCV学习笔记(01)我的第一个OpenCV程序(环境配置)

昨天刚刚考完编译原理,私心想着可以做一些与考试无关的东西了.一直想做和图像处理相关的东西,趁这段时间有空学习一下OpenCV,搭建环境真是一件麻烦的事情,搞了近三个小时终于OK了.先来张图: 大致描述一下步骤吧: 一.安装前准备 1.VS2012(网上看到很多用的VS2010,但是基本不影响) 2.OpenCV 安装包(我下载的是最新的2.4.9) 二.安装OpenCV 1.解压OPenCV 说是安装,其实就是解压,OpenCV的Windows安装程序就是一个自解压程序: 这里我解压到C:\Pr

opencv学习笔记(03)——遍历图像(迭代器法)

1 #include <opencv2\highgui\highgui.hpp> 2 #include <opencv2\imgproc\imgproc.hpp> 3 #include <opencv2\core\core.hpp> 4 5 void colorReduce(cv::Mat& img, int div=64); 6 7 8 int main() 9 { 10 cv::Mat img_orginal = cv::imread("F:\\i