Opencv中Mat类详细解读(学习笔记)

本文介绍了OpenCV中Mat类的基本概念,包括Mat类的构造、赋值方法,以及如何进行矩阵运算和元素读取。通过实例展示了如何使用at、ptr和迭代器来操作Mat类的单通道和多通道矩阵元素。
摘要由CSDN通过智能技术生成

基于windows10、vs2015、OpenCv4.1.0。

目录

1、Mat类简介

2、Mat类的构造与赋值

2.1、Mat类的构造

2.2、Mat类的赋值

3、Mat类支持的运算

3.1Mat类的加减乘除运算:

3.2两个Mat类矩阵的乘法运算

4、Mat类元素的读取

4.1多通道数据的存储

 4.2Mat类常用属性和成员方法

4.3通过at读取Mat类单通道矩阵的元素

4.4通过at读取Mat类多通道矩阵的元素

4.5通过指针ptr读取Mat矩阵种的元素

4.6通过迭代器访问Mat类矩阵中的元素


1、Mat类简介

OpenCv提供了Mat类用来存储矩阵类型数据,包括向量、矩阵、图像等数据。Mat类分为分为矩阵头和指向存储数据的矩阵指针两部分。矩阵头包含矩阵的尺寸、存储方法、地址和引用次数。矩阵头是一个常数,绝大数情况下,矩阵头的大小远小于矩阵数据量的大小。

#include <opencv2\opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
	Mat a;
	a = imread("D:\\lena.jpg"); //向a中赋值图像数据
	Mat b = a;//只是复制了矩阵头和指向存储数据的指针(指向的是同一个矩阵数据)
	waitKey();
	return 0;
}

声明一个指定类型的Mat类:

Mat b = Mat_<double>(3, 3);//创建一个3*3的矩阵存放double类型数据

通过OpenCv数据类型创建Mat类

Mat a(640, 480, CV_8UC3)//创建一个640*480的3通道矩阵用于存放彩色图像
Mat a(3, 3, CV_8UC1);//创建一个3*3的8位无符号整数的单通道矩阵
Mat a(3, 3, CV_8U);//创建单通道矩阵,C1标识可以省略

2、Mat类的构造与赋值

2.1、Mat类的构造

默认构造函数

cv::Mat::Mat();

 这种构造方式,不需要传递任何参数,在后续给变量赋值的时候会自动判断矩阵的类型与大小,实现灵活的存储,常用于存储读取的图像数据和某个函数运算的输出结果。

根据输入矩阵尺寸和类型构造

cv::Mat::Mat(int rows,int cols,int type)

其中rows:构造矩阵的行数;cols:矩阵的列数;type:矩阵存储的数据类型,例如CV_8UC1之类。

用Size()结构构造Mat类。

cv::Mat::Mat(Size size(), int type);

其中size:为二位数组变量尺寸,通过Size(cols,rows)进行赋值(列在前,行在后);type:矩阵存储的数据类型,例如CV_8UC1之类。

示例:

cv::Mat a(Size(480,580), CV_8UC1);//构造一个行580,列480的单通道矩阵

利用已有矩阵构造Mat类

cv::Mat::Mat(const Mat & a);

这种构造方式只是复制了Mat类的矩阵头,矩阵指针指向是同一个地址。(浅复制)

若要深复制,可用

b = a.clone();

构造已有Mat的子类

cv::Mat::Mat(const Mat & a,const Range & rowRange, const Range & colRange=Range::all);

其中,m:已经构建完成的Mat;rowRange:在已有的矩阵中需要获取的行数范围,是一个Range变量,例如从第二行到第五行表示为Range(2,5);colRange也是一样,在已有的矩阵中需要获取的列数范围,是一个Range变量,例如从第二列到第五列表示为Range(2,5)省略时,所有的列都会被截取。(注意:这种方式构造的类与已有Mat类共享数据。)

 例如:

cv::Mat b(a, Range(2, 5), Range(1, 4));//从a中截取第二行到第五行,第一列到第四列的内容
c
  • 30
    点赞
  • 212
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值