OpenCV图像处理-Mat对象常用方法

OpenCV图像处理-Mat对象常用方法

    • 前言
    • Mat对象与IplImage对象
    • Mat对象常用构造函数
    • Mat对象常用方法

前言

本文使用的环境为:Qt5.11 + OpenCV3.4.6
环境安装参考文档:https://blog.csdn.net/z634863434/article/details/89950961

Mat对象与IplImage对象

Mat对象是OpenCV2.0之后引进的图像数据结构,基于C++面向对象的数据结构。其在生成时,自动分配内存、不存在内存泄漏的问题。分头部和数据部分。
IplImage对象是早期用C语言风格的数据结构,需要开发者自己分配与管理内存,可能会导致内存的泄露问题。

Mat对象常用构造函数

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);

Mat对象常用方法

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

你可能感兴趣的:(Qt,OpenCV)