本文使用的环境为:Qt5.11 + OpenCV3.4.6
环境安装参考文档:https://blog.csdn.net/z634863434/article/details/89950961
Mat对象是OpenCV2.0之后引进的图像数据结构,基于C++面向对象的数据结构。其在生成时,自动分配内存、不存在内存泄漏的问题。分头部和数据部分。
IplImage对象是早期用C语言风格的数据结构,需要开发者自己分配与管理内存,可能会导致内存的泄露问题。
1.Mat()
创建一个Mat对象,在构造时不进行任何操作
//创建一个Mat对象
Mat img;
2.Mat(int rows , int cols,int type)
根据用户指定的行数、列数以及类型创建一个Mat对象
//创建一个3*3的图像,每个通道8个字节长度 uchar类型,通道数量为1的Mat对象
Mat img= Mat(3,3,CV_8UC1);
3.Mat(Size size , int type)
根据用户指定的大小以及类型,创建一个Mat对象
//读取本地图像返回给Mat对象src,根据src的大小,创建一个3*3的图像,每个通道8个字节长度 uchar类型,通道数量为1的Mat对象
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat img= Mat(src.size(),CV_8UC1);
4.Mat(int rows , int cols,int type,const Scalar &s)
根据用户指定的行数、列数以及类型创建一个Mat对象并初始化每个像素的值,向量长度必须对应通道数
//创建一个3*3的图像,每个通道8个字节长度 uchar类型,通道数量为3的Mat对象,并将初始颜色设为(127,0,255)
Mat img= Mat(3,3,CV_8UC3,Scalar(127,0,255))
5.Mat(Size size , int type , const Scalar &s)
根据用户指定的大小以及类型,创建一个Mat对象并初始化每个像素的值,向量长度必须对应通道数
//读取本地图像返回给Mat对象src,根据src的大小,创建一个3*3的图像,每个通道8个字节长度 uchar类型,通道数量为3的Mat对象,并将初始颜色设为(127,0,255)
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat img= Mat(src.size(),CV_8UC3,Scalar(127,0,255));
6.数组构造
使用矩阵数据构造一个Mat对象
//构成3*3
// 0 -1 0
// -1 5 -1
// 0 -1 0
//的Mat图像
Mat mat = (Mat_(3,3)<<0,-1,0,-1,5,-1,0,-1,0);
1.void copyTo(Mat mat)
Mat对象深拷贝
//将src对象的图像复制到dst对象中
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat dst;
src.copyTo(dst);
2.void converto(Mat dst,int type)
Mat对象转化函数
//将src转化成每个通道8个字节长度 uchar类型,通道数量为3的Mat对象(可以在函数后面附加因子进行计算)
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat dst;
str.converto(dst,CV_8UC3);
3.Mat clone()
Mat对象深拷贝
//将src对象的图像复制到dst对象中
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat dst;
dst.clone(src);
4.int channels()
获取当前图像的通道数
//获取src的通道数
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
int channel = src.channels();
5.int depth()
获取当前图像的深度
//获取src的深度
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
int channel = src.depth();
6.bool empty()
判断图像是否为空
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat dst;
src.empty(); //false
dst.empty(); //true
7.uchar* ptr(i = 0)
获取当前图像的指针
//获取src图像的第一行对应指针
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
const unchar* fisrtRow = src.ptr(0);
8.Mat zeros(int rows,int cols,int type)
创建全0的Mat对象
//创建2*2每个通道8个字节长度 uchar类型,通道数量为1的全0 Mat对象
Mat img = Mat::zeros(2,2,CV_8UC1)
9.Mat eye(int rows,int cols,int type)
创建对角线为1的Mat对象
//创建2*2每个通道8个字节长度 uchar类型,通道数量为1的对象线为1 Mat对象
//1 0
//0 1
Mat img = Mat::eye(2,2,CV_8UC1)
10. _Tp& at(int row,int col)
获取图像上一个点的像素,可对其进行获取或者修改,灰度图像和RGB图像有区别
/*对于灰度图像进行像素点的获取以及修改*/
//打开原始图像
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
Mat gray_src;
//将RGB图像转化成灰度图像
cvtColor(src,gray_src,CV_BGR2GRAY);
//获取灰度图像在 (0,0)处的像素值
uchar test = gray_src.at(0,0);
//修改灰度图像在 (0,0)处的像素值
gray_src.at(0,0) = 0
/*对于RGB图像进行像素点的获取以及修改*/
Mat src = imread("E:/OpenCV/OpenCVPicture/horse.png");
//获取RGB像素
uchar blue= src.at(0,0)[0]; //蓝色通道像素值
uchar green= src.at(0,0)[1]; //绿色通道像素值
uchar red = src.at(0,0)[2]; //红色通道像素值
//修改RGB像素
src.at(0,0)[0] = 0; //修改蓝色通道像素为0
src.at(0,0)[1] = 0; //修改绿色通道像素为0
src.at(0,0)[2] = 0; //修改红色通道像素为0