opencv 学习记录(1)Mat IpImage

Mat相对于IplImage的优势:

1、自动开辟内存,在不需要的时候立即释放内存。不用人为的去纠结内存管理。也就是C++类相对于C语言的优势。但嵌入式中还是C语言。。。。

2、每一个Mat对象都有自己的信息头,但共享一个数据矩阵。拷贝构造函数只拷贝信息头和矩阵指针,不拷贝数据图像矩阵。

 

 

Mat简单使用:

举例:

Mat A, C;                                 // 只创建信息头部分

A = imread(argv[1], CV_LOAD_IMAGE_COLOR); // 这里为矩阵开辟内存

Mat B(A);                                 // 使用拷贝构造函数

C = A;                                    // 赋值运算符

说明:以上代码中的所有Mat对象最终都指向同一个也是唯一一个数据矩阵。虽然它们的信息头不同,但通过任何一个对象所做的改变也会影响其它对象。实际上,不同的对象只是访问相同据的不同途径而已。

 

 

当我们不仅想拷贝数据头,还想拷贝图像数据的时候,可以使用函数clone()或者 copyTo()。

举例:

Mat img1 = img.clone();

Mat img2;

img.copyTo(img2);

此处,img1和img2的值不相互影响,不共享一个数据矩阵。

但是由于图像矩阵都比较庞大,考虑到时间问题,尽量避免整个图像矩阵的拷贝。

 

 

在Mat中,当我们想要使用一幅图像的部分区域,也就是ROI时,可以使用如下方式:

举例:

Mat img1 (img,Rect(10,10,100,100));   //这里使用了一个长方形圈出一个ROI区域

Mat img2 = img(Range:all(),Range(1,3));  //这里就抠出了边界作为ROI

此处,由于用的是同一个数据矩阵,如果修改img1或者img2的值,也会修改img中的值。

 

 

IplImage与 Mat互相转换:

举例1:

IplImage *img = cvLoadImage("a.png",1);

Mat img1(img);

举例2:

Mat img = cvLoadImage("a.png",1);

IplImage *img2 (img);

 

结束。

 

参考网站:opencv中文论坛。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值