opencv的基本数据结构(一)(转)
从2001年以来,opencv的函数库一直是基于C接口构建的,因此在opencv1.0版本中,一般使用IplImage的C结构体在内存中存储图像,因此,我们在很多较经典的书籍或者开源项目中依然可见IplImage。但是用其存储图像的时候必须在退出前将图像内存手动release掉,即添加语句cvReleaseImage(&IplImage);,否则会造成内存泄漏。Mat类带来了自动的内存管理,同时它的操作也更加简单,比如用imshow显示图像,imread读取图像等等,跟Matlab有点接近。下面是将图像容器类mat转化成IplImage结构体的一种方法,最后别忘了cvReleaseImage(&pImg)。
Mat frame,frame1;
IplImage* pImg;
frame=capture.read();
frame1=frame.clone();
pImg=cvCreateImage(cvSize(frame.cols,frame.rows),,);
pImg->imageData=(char*)frame1.data;
...
Mat是一个类,它由两个数据部分组成:矩阵头和一个指向存储所有像素值的矩阵的指针。其中矩阵头包含了矩阵的尺寸、存储方法、储存地址等信息,由此可以看出矩阵头所占的内存很小,通常是一个常数值,而具体存储所有像素值的矩阵则非常大。因此,在程序中传递图像并创建副本时,大的开销是由矩阵造成的,而不是信息头。其实上面给的mat转IplImage结构体就是一个例子,显然复制图像会增加算法的复杂度,降低程序的性能。形象点说,在一个班级里,矩阵头就相当于存储了班级里有多少人、男女比多少、平均身高等信息,而矩阵就储存了班级中所有同学的所有基本信息,每一个同学就相当于是一个像素矩阵中的一个元素,那么根据不同的存储方法就得到了不同的元素表示方法,显然矩阵要比矩阵头复杂得多。
为了解决上述代码存在的问题。opencv使用了引用计数机制,其思路就是让每个Mat对象有自己的信息头,但是共享同一个矩阵。也就是让矩阵指针指向同一地址,共用一片内存来实现。复制图像的时候只是复制了矩阵头的信息和矩阵指针,并不是复制了整个矩阵。例如下面这段代码:
Mat A,C;//仅创建信息头部分
A= imread("1.jpg",CV_LOAD_IMAGE_COLOR);//这里为矩阵开辟内存
Mat B(A);//使用拷贝构造函数
C=A;
这段代码中,A、B和C都是Mat类型,它们都指向同一个也是唯一一个数据矩阵。虽然它们的信息头不同,但通过任何一个对象所做的改变也会影响其它对象。而通过clone()或者copyTo()来复制一个图像,就包括了矩阵本身,也因此,改变复制对象的内容并不会改变源矩阵,例如frame1显然是复制frame,因此对frame1的操作并不改变frame。
Mat的常见属性
| 属性 | 说明 |
|---|---|
| data | uchar型的指针。Mat类分为了两个部分:矩阵头和指向矩阵数据部分的指针,data就是指向矩阵数据的指针。 |
| dims | 矩阵的维度,例如5*6矩阵是二维矩阵,则dims=2,三维矩阵dims=3. |
| rows | 矩阵的行数 |
| cols | 矩阵的列数 |
| size | 矩阵的大小,size(cols,rows) |
| channels() | 矩阵元素拥有的通道数,例如常见的彩色图像,每一个像素由RGB三个通道组成 |
| type() | 表示了矩阵中元素的类型以及矩阵的通道个数,它是一系列的预定义的常量,其命名规则为CV_(位数)+(数据类型)+(通道数)如:,CV_8UC3 |
| depth() | 矩阵中元素的一个通道的数据类型,这个值和type是相关的。例如 type为 CV_8UC3,一个3通道的16位的有符号整数。那么,depth则是CV_8UC |
| elemSize() | 矩阵一个元素占用的字节数(不区分通道,即多个通道的总和) |
| elemSize1() | 矩阵一个元素每个通道占用的字节数(区分通道,单个通道的值) |
| flags | 一个int型数字,保存了许多有用的信息,flags说明; |
创建Mat的方式:
1、Mat M
创建一个矩阵头,没有数据。
2、Mat M(2,2,CV_8UC3,Scalar(0,0,1));
2*2大小的矩阵,每个元素为3通道8位无符号整数,如下:
0 0 1 0 0 1
0 0 1 0 0 1
3、Mat M(2,2,CV_8UC1,Scalar(10));
与上面类似:
10 10
10 10
4、Mat M(2,2,CV_8UC1,Scalar::all(0));
5、以逗号分隔符初始化赋值:Mat M = (Mat_(3,3) << 1,2,3,4,5,6,7,8,9);
6、为已经存在的IplImage指针创建信息头,例如:
IplImage* img=cvLoadImage("1.jpg",);
Mat mtx(img);//转换IplImage*为Mat
7、利用create()函数
Mat M;
M.create(,,CV_8UC());
cout<<"M="M<<endl;
但是这种方法不能为矩阵设初值,只是在改变尺寸时重新为矩阵数据开辟内存而已。
8、Mat还有一些matlab式函数用来创建和初始化矩阵:
Mat E = Mat::eye(4,4,CV_64F); //单位矩阵
Mat Z = Mat::zeros(4,4,CV_32F); //0矩阵
Mat O = Mat::ones(4,4,CV_8UC1); //1矩阵
9、为已经存在的对象创建新的信息头
Mat E=Mat::eye(,,CV_64F);
Mat Row=E.row().clone();
cout<<Row<<endl;
opencv的基本数据结构(一)(转)的更多相关文章
- OpenCV(2)-Mat数据结构及访问Mat中像素
Mat数据结构 一开始OpenCV是基于C语言的,在比较早的教材例如<学习OpenCV>中,讲解的存储图像的数据结构还是IplImage,这样需要手动管理内存.现在存储图像的基本数据结构是 ...
- opencv新版本的数据结构
转自 http://blog.csdn.net/yang_xian521/article/details/7108387 记得我在OpenCV学习笔记(四)——新版本的数据结构core里面讲过新版本的 ...
- opencv基本的数据结构(转)
DataType : 将C++数据类型转换为对应的opencv数据类型 enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, ...
- opencv的基本数据结构(二)(转)
转自:原文链接,以下代码.图片.内容有点改动,只为转载不降低博客内容的可阅性,版权归原作者所有. OpenCV中强大的Mat类型大家已经比较熟悉了.这里梳理一些在工程中其他经常用到的几种基本数据类型. ...
- OpenCV的基本数据结构
参考:http://www.cnblogs.com/guoqiaojin/p/3176692.html
- Opencv 的数据结构
opencv的基本数据结构 结构 成员 意义 CvPoint int x,y 图像中的点 CvPoint2D32f float x,y 二维空间中的点 CvPoint3D32f float x,y,z ...
- OpenCV学习(2)--基本数据结构
OpenCV的基本数据结构 CvPoint:表示图像中的点 CvPoint2D32f:二维空间中的点 CvPoint3D32f:三维空间中的点 这些都是结构体,并不是C++语言中的类,所以他们的构造函 ...
- opencv 人脸识别
背景知识 OpenCV 是一个开源的计算机视觉和机器学习库.它包含成千上万优化过的算法,为各种计算机视觉应用提供了一个通用工具包.根据这个项目的关于页面,OpenCV 已被广泛运用在各种项目上,从 ...
- opencv 61篇
(一)--安装配置.第一个程序 标签: imagebuildincludeinputpathcmd 2011-10-21 16:16 41132人阅读 评论(50) 收藏 举报 分类: OpenCV ...
随机推荐
- CentOS下Neo4j安装教程
本文记录一下在CentOS 6.7上,安装neo4j图数据库,本文安装的版本为neo4j-community-2.3.9-unix.tar.gz. 下载Neo4j安装包 使用wget命令获取Neo4j ...
- xshell 常用快捷键
1.连接mysql数据库mysql -uroot -p -h127.0.0.1 -P3306 2.列出所有sessionshow full processlist; 3.查看20条执行时间最长的SQL ...
- [Cnbeta]BAT财报对比
https://www.cnbeta.com/articles/tech/789123.htm 随着腾讯上周公布财报,BAT三家2018年第三季度的数据均已公布,曾经与腾讯.阿里齐名的百度正被拉开越来 ...
- (转)web性能优化
前端是庞大的,包括 HTML. CSS. Javascript.Image .Flash等等各种各样的资源.前端优化是复杂的,针对方方面面的资源都有不同的方式.那么,前端优化的目的是什么 ? 1. 从 ...
- 绿色计算大赛决赛 第二阶段 消息传递(斯坦纳树 状压dp+spfa)
传送门 Description 作为公司老板的你手下有N个员工,其中有M个特殊员工.现在,你有一个消息需要传递给你的特殊员工.因为你的公司业务非常紧张,所以你和员工之间以及员工之间传递消息会造成损失. ...
- CF915E Physical Education Lessons
题意: Alex高中毕业了,他现在是大学新生.虽然他学习编程,但他还是要上体育课,这对他来说完全是一个意外.快要期末了,但是不幸的Alex的体育学分还是零蛋! Alex可不希望被开除,他想知道到期末还 ...
- LINQ 模糊搜索
IList<entity> ls = new List<entity>(); ls = (from k in ls where k.Name.Contains("sa ...
- keepalived使用nc命令检测udp端口
keepalived支持的健康检测方式有:HTTP_GET|SSL_GET.TCP_CHECK.SMTP_CHECK.MISC_CHECK. 由于keepalived自身并不支持udp检测,有TCP_ ...
- 2017实习【Java研发】面经
标签: 实习 面经 Java研发 阿里.腾讯.华为 找2017暑假实习,经历过被腾讯拒绝的无奈,也有拿到阿里和华为offer的喜悦,找实习过程也有一段时间了,在此把之前的面试知识点和经历做个小总结,以 ...
- bzoj3533【Sdoi2014】向量集
题目描述 维护一个向量集合,在线支持以下操作:"A x y (|x|,|y| < =10^8)":加入向量(x,y);" Q x y l r (|x|,|y| &l ...