本文为原创文章,未经本人允许,禁止转载。转载请注明出处。
1.Mat对象和IplIamge对象
- Mat对象是OpenCV2.0之后引进的图像数据结构、自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。分为两个部分:头部和数据部分。
- IplIamge是从2001年OpenCV发布之后就一直存在,是C语言风格的数据结构,需要开发者自己分配与管理内存、对大的程序使用它容易导致内存泄漏问题。
2.Mat对象构造函数
Mat对象有以下6种构建方法:
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(int ndims,const int* sizes,int type)
Mat(int ndims,const int* sizes,int type,const Scalar &s)
2.1.图像的其他构造方法
方法一:
img.create(size,type)
,但是.create
不能赋值,赋值需要用img=Scalar(0,0,0)
。
方法二:
Mat::eye(3,3,type)
构造一个3行3列(即3*3)的图像,并且对角线上每个像素点的第一个通道赋值为1,其余均为0,对如上语句,如果type为3通道图像的话,得到的图像数组矩阵见下:
类似的还有:
Mat::ones()
:每个像素的第一个通道为1,其余通道为0。Mat::zeros()
:每个像素的每个通道都为0。
3.部分复制和完全复制
👉部分复制:一般情况下只会复制Mat对象的头和指针部分,不会复制数据部分。
👉完全复制:把Mat对象的头部和数据部分一起复制。
1
2
3
4
5
Mat A=imread(imgFilePath);
Mat B(A);//部分复制
Mat F=A.clone();//完全复制
Mat G;
A.copyTo(G);//完全复制
(部分复制:共用一个矩阵,即一张图,该图如果发生改变,A和B都将改变。而完全复制是各自用各自的数据部分,互不干扰。)
3.1.copyTo()
copyTo()
有三种声明方式:
1
2
3
4
5
6
//1
Mat clone() const CV_NODISCARD;
//2
void copyTo( OutputArray m ) const;
//3
void copyTo( OutputArray m, InputArray mask ) const;
其中第三种方式还可用于图像融合,mask的尺寸必须和原图像相同,它的非零元素表示需要复制的矩阵元素,mask必须是CV_8U
类型的,可以有1个或多个通道。例如:
1
src.copyTo(dst,mask);
如果mask在像素点$(i,j)$的像素值不为0,则把src在像素点$(i,j)$的像素值直接赋给dst的$(i,j)$处;如果mask在像素点$(i,j)$的像素值为0,则dst保留其在$(i,j)$处的像素值。