Mat结构及其它数据类型详解
目录简介Mat对象Mat的常见属性Mat的type属性Mat的step属性常用构造方法简介IplImage是从2001年Opencv发布后就一直存在,是C语言的风格的数据结构,需要开发者自己分配与管理内存,对于大型程序容易出现内存泄漏。Mat结构是Opencv2.0之后引出的,它可以自动分配内存空间,不会出现内存泄漏,是C++风格的数据结构,包含头部和数据部分。Mat对象mat对象分为矩阵头(包含
目录
简介
IplImage是从2001年Opencv发布后就一直存在,是C语言的风格的数据结构,需要开发者自己分配与管理内存,对于大型程序容易出现内存泄漏。
Mat结构是Opencv2.0之后引出的,它可以自动分配内存空间,不会出现内存泄漏,是C++风格的数据结构,包含头部和数据部分。
Mat对象
mat对象分为矩阵头(包含信息有矩阵的大小,用于存储的方法,矩阵存储的地址等)和和一个指针,指向包含了像素值的矩阵。矩阵头部的大小是恒定的。然而,矩阵本身的大小因图像的不同而不同。
Mat的常见属性、方法
| 属性 | 说明 |
|---|---|
| data | uchar类型的指针,指向矩阵数据部分 |
| dims | 矩阵的维度 |
| rows | 矩阵的行数 |
| cols | 矩阵的列数 |
| size | 矩阵的大小rows*cols |
| channels() | 矩阵的通道数 |
| type | 矩阵的数据类型和通道数 |
| depth() | 矩阵一个通道的数据类型 |
| elemSize() | 矩阵一个元素所占的字节数 |
| elemSize1() | 矩阵一个通道下的一个元素所占的字节数 |
| total() | 返回Mat类中的元素总数。例如,在图像中,该值等于图像宽度乘以高度 |
| at<vec类型>(x,y) | 获取像素点的值 |
| forEach<>() | 可以用来对Mat类的所有元素并行运行一个函数。需要为该函数提供函数对象、函数指针或lambda表达式 |
depth:enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 }
Mat的type属性
- 数据类型
| 数值 | 说 |
|---|---|
| CV_8U | 8位无符号整数 |
| CV_8S | 8位符号整数 |
| CV_16U | 16位无符号整数 |
| CV_16S | 16位符号整数 |
| CV_32S | 32位符号整数 |
| CV_32F | 32位浮点数 |
| CV_64F | 64位浮点数 |
- 通道类型
| 数值 | 说明 |
|---|---|
| C1 | 单通道 |
| C2 | 双通道 |
| C3 | 三通道 |
- type
数据类型+通道类型,如:CV_8UC3
Mat的step属性
矩阵有几维,step[]数组就有几个元素,如3维,则有3个元素,step[0],step[1],step[2].分别对应面,线,点。
常用构造方法
- 初始化
- Mat(int rows,int cols,int type)
- Mat(Size size,int type)
- Mat(int rows,int cols,int type,const Scalar &s)
- Mat(Size size,int type,const Scalar &s)
- 浅拷贝
- Mat img2 = img1;
- Mat img2(img1);
- 深拷贝
- Mat img2 = img1.clone();
- Mat img2,img1.copyTo(img2);
常用运算
+号
-号
*(标量)
mul() 矩阵对应元素相乘
*(矩阵) 矩阵乘法
t() 转置
inv() 求逆
常用方法
- countNoeZero() 统计非零元素
- meanStdDev() 计算通道的均值和标准值
- minMaxLoc() 计算矩阵最小、大值及其位置
- bool empty()
其他数据类型
Vec
应用:以定义任何类型的向量和大量的组件
例: Vec<double,19> myVector;
- 宏定义
typedef Vec<uchar,2> Vec2b;
typedef Vec<uchar,3> Vec3b;
typedef Vec<short,2> Vec2s;
typedef Vec<short,3> Vec3s;
typedef Vec<ushort, 2> Vec2w;
typedef Vec<ushort, 3> Vec3w;
typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d;
Scalar
应用:表示一个像素点的像素值
Vec对象的派生,有四个元素。
若要访问Vec和Scalar值,可以使用[]运算符。
Point
应用:像素点的坐标,也可以表示三维点坐标。
宏定义:Point2i Point2f Point3f Point3i
Size
应用:图像的大小
成员:width 、height
方法:area()
Rect
应用:2D矩阵,规定区域
Rect r(x,y,w,h) 左上角坐标和矩阵宽高
RotatedRect
应用:旋转矩阵
RotatedRect(const Point2f& center,const Size2f& size,float angle); 中心点、宽高度以及旋转角度
基本数据存储
opencv有时需要存储和读取数据,这里提供两种文件来保存,xml和yaml。
把数据的读取和写入可以用FileStorage类,同时使用流运算符<<操作STL流。
#include <opencv2/opencv.hpp>
using namespace cv;
int main(int, char** argv) {
//create our writer
FileStorage fs("test.yml", FileStorage::WRITE);
//create a simple sample
Mat m1 = Mat::eye(2, 3, CV_32F);
fs << "Result" << m1;
fs.release();
FileStorage fs2("test.yml", FileStorage::READ);
Mat r;
fs2["Result"] >> r;
std::cout << r << std::endl;
system("pause");
return 0;
}
更多推荐

所有评论(0)