图像数据结构

1. IplImage:2001年发布opencv后一直存在,需要自己分配管理内存。
2. Mat:opencv2.0引入,自动分配内存,不存在内存泄漏。Mat 是一个类,分为头部和数据部分,矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵的指针。
注意:Mat通过引用计数来释放内存

创建图像:构造函数

1. Mat::Mat(int rows, int cols, int type, const Scalar& s)
rows:行数
cols:列数
type:类型(一般是unsigned char)
s:元素值,bgra四个元素的向量
2. Mat::Mat(Size size, int type, const Scalar& s)
size:大小
type:类型
s:元素值,bgra四个元素的向量

创建图像:create()

如果 create()函数指定的参数与图像之前的参数相同,则不进行实质的内存申请操作;如果参数不同,则减少原始数据内存的索引,并重新申请内存。
Mat M(2,2, CV_8UC3);//构造函数创建图像
M.create(3,2, CV_8UC2);//释放内存重新创建图像

图像复制:完全复制(复制头部和数据)

void copyTo( OutputArray m ) const;
Mat clone() const CV_NODISCARD;

图像复制:部分复制(只复制头部)

赋值和拷贝复制函数是部分复制,复制出来的Mat对象的头部中的指针指向原始的数据,这时对图像修改影响原始图像。(复制矩阵数据耗时,opencv api参数一般使用引用)
Mat B(A)

图像信息

图像行数:rows
图像列数:cols
图像深度: int depth() const;
图像通道数:int channels() const;

把图像从一个色彩空间转换到另一个

void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
src:图像
dst:目标图像
code:COLOR_源色彩空间2目标色彩空间(COLOR_BR2GRAY)

类型转换

void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const;
m:目标图像
rtype:类型

矩阵的基本元素表达

对于单通道图像,其元素类型一般为 8U(uchar)/16S(short)/32F(float) 等;对于多通道图像,如 RGB 彩色图像,需要用三个通道来表示。OpenCV 中有模板类 Vec,可以表示一个向量。 OpenCV 中使用 Vec 类预定义了一些小向量,可以将之用于矩阵元素的表达。
1. int类型
typedef Vec<int, 2> Vec2i; //2通道
typedef Vec<int, 3> Vec3i; //3通道
typedef Vec<int, 4> Vec4i; //4通道
2. char
typedef Vec<uchar, 3> Vec3b; //3通道
3. float
typedef Vec<float, 3> Vec3f; //3通道

选取图像局部区域

Mat 类提供了多种方便的方法来选择图像的局部区域。
注意:这些方法并不进行内存的复制操作。如果将局部区域赋值给新的 Mat 对象,新对象与原始对象共用相同的数据区域,不新申请内存(速度较快)。
单行或单列选择(提取矩阵的一行或者一列)
Mat Mat::row(int i) const
Mat Mat::col(int j) const
修改像素值:
A.row(i) = A.row(i)*2;

创建一张图像

MatExpr ones(Size size, int type);
MatExpr zeros(Size size, int type);
size:图像大小
type:图像类型
注意:
ones:b通道置1,其它通道为0
zeros:全部置为0

像素范围

saturate_cast(value)
value小于最小值时返回最小值,大于最大值时返回最大值