OpenCV随笔002-图像的基本操作

从OpenCV 1.0到2.0:Mat类的引入与IplImage的废弃
本文深入探讨了OpenCV从1.0版本到2.0版本的更新,重点介绍了Mat类的引入,及其与IplImage数据结构的区别。阐述了自动内存管理的优势,并提供了Mat类的基本操作示例。

    OpenCV1.0 采用的是 IplImage 的C语言结构体,但这种方法必须接受C语言所有的不足,这其中最大的不足要数手动内存管理,其依据是用户要为开辟和销毁内存负责。当代码庞大时,其缺点也慢慢显露出来了。

    为此,OpenCV在2.0版本中引入了一个新的C++接口,利用自动内存管理给出了解决问题的新方法。使用这个方法,你不需要纠结在管理内存上,而且你的代码会变得简洁。但C++接口唯一的不足是当前许多嵌入式开发系统只支持C语言。

    Mat 图像的基本容器,基本上来说,Mat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可以是不同的维数)的指针。

#include<iostream>
#include"opencv2/opencv.hpp"
using namespace cv;//使用命名空间 cv
//在opencv2中,所有的C++接口函数和相关的类,都定义在命名空间cv中。当需要引用时,有两种方法可以实现:
//(1)在main函数之前 ,注明使用的命名空间
//(2)在使用相关函数和类的时候 加上前缀cv::
//例如使用c++接口的Mat类,那么写成:cv::Mat
using namespace std;
int main()
{
	Mat image;//定一个Mat类型的对象 其矩阵大小默认是0*0
	cout<<"矩阵默认大小 height is "<<image.size().height<<", width is "<<image.size().width<<endl;//验证图像尺寸
	image=imread("D:/Demo.jpg");//读取图像
	if (!image.data)
	{
		//图像未创建,此处的成员变量事实上是指向已分配的内存块的指针,包括图像数据,当不存在数据时,其值为0
		return -1;
	}
	namedWindow("Image");//创建窗口
	imshow("Image",image);//显示图像
	waitKey(0);//等待按键输入
	imwrite("D:/Demo2.bmp",image);//保存图像
	Mat im2,im3;
	im2=image;//浅拷贝,数据地址是一样的
	image.copyTo(im3);//深拷贝,数据地址不一样,分布有独立的内存空间
	return 0;
}

    传统的IplImage格式也可转换为Mat格式

IplImage* src = cvLoadImage("1.jpg"); //IplImage类型的图像
cv::Mat image(src,false);//参数false表示image与src共享内存,如果参数是true表示有独立内存
cvReleaseImage(&src);//释放内存
cv::Ptr<IplImage> src = cvLoadImage("1.jpg"); //通过这种方式 内存可以自动释放,而不是手动调用cvReleaseImage进行释放
         
    IplImage是个废弃的数据结构,尽量使用cv::Mat






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值