OpenCV入门-Mat类

本文介绍了OpenCV中的核心数据类型Mat类,包括如何创建不同通道的图像矩阵,如单通道、双通道和三通道图像。此外,还展示了Mat类的属性读取,如行数、列数和通道数。最后,讨论了Mat类的基本运算,如加减乘除、数乘、矩阵求逆等操作。
摘要由CSDN通过智能技术生成

创建Mat类

Mat类是opencv中表示图像的常用数据类型,其包括头部和数据部分,头部存储Mat的长、宽、通道数等信息,数据部分存放每个点的像素值。

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {
	//初步创建Mat对象
	Mat a(3, 3, CV_8UC1);
	Mat b(Size(3, 3), CV_8UC1);
	//CV_8UC1表示创建单通道的图像, CV_8UC2表示创建两通道的图像
	// Scalar表示B,G,R三个通道的颜色
	Mat c1(3, 3, CV_8UC1, Scalar(4, 5, 6));
	Mat c2(3, 3, CV_8UC2, Scalar(4, 5, 6));
	Mat c3(3, 3, CV_8UC3, Scalar(4, 5, 6));
	//以枚举形式复制的矩阵
	Mat d = (Mat_<int>(1, 5) << 1, 2, 3, 4,5);
	//创建对角阵,且参数必须是1*n的矩阵
	Mat e = Mat::diag(d);
	//做抠图
	Mat f = Mat(e, Range(2, 4), Range(2, 4));	
	cout << a << endl;
	cout << b << endl;
	cout << c1 << endl;
	cout << c2 << endl;
	cout << c3 << endl;
	cout << d << endl;
	cout << e << endl;
	cout << f << endl;	
	return 0;
}

返回结果:

[205, 205, 205;
 205, 205, 205;
 205, 205, 205]
[205, 205, 205;
 205, 205, 205;
 205, 205, 205]
 //单通道矩阵
[  4,   4,   4;
   4,   4,   4;
   4,   4,   4]
   //双通道,所以只选择了前面两个数
[  4,   5,   4,   5,   4,   5;
   4,   5,   4,   5,   4,   5;
   4,   5,   4,   5,   4,   5]
   //三通道图像
[  4,   5,   6,   4,   5,   6,   4,   5,   6;
   4,   5,   6,   4,   5,   6,   4,   5,   6;
   4,   5,   6,   4,   5,   6,   4,   5,   6]
[1, 2, 3, 4, 5]
//生成的对角阵
[1, 0, 0, 0, 0;
 0, 2, 0, 0, 0;
 0, 0, 3, 0, 0;
 0, 0, 0, 4, 0;
 0, 0, 0, 0, 5]
[3, 0;
 0, 4]

Mat类的读取

Mat类中常用的属性包括

  1. rows----获得行数
  2. cols-----获得列数
  3. elemSize----获得每个元素的字节数
  4. channels-----获得通道数
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {	
	//CV_8UC1表示创建单通道的图像, CV_8UC2表示创建两通道的图像
	Mat c1(3, 3, CV_8UC1, Scalar(4, 5, 6));
	Mat c2(3, 3, CV_8UC2, Scalar(4, 5, 6));
	Mat c3(3, 3, CV_8UC3, Scalar(4, 5, 6));
	//以枚举形式复制的矩阵
	Mat d = (Mat_<int>(1, 5) << 1, 2, 3, 4,5);	
	//单通道的读取
	cout << d.at<int>(0, 0) << endl;
	//多通道的读取Vec2b,Vec3b---存放uchar类型,Vec2i,Vec3i--存放int类型
	Vec2b vc = c2.at<Vec2b>(0, 1);
	cout << vc << endl;
	cout << (int)vc[0] << endl;	
	return 0;

运行结果:

1
[4, 5]
4

Mat类的运算

Mat符号运算:矩阵加减乘除,数乘等
Mat相关函数:

  1. absdiff()----两个矩阵对应元素差的绝对值
  2. add()--------两个矩阵求和
  3. addWeighted()-----两个矩阵线性求和
  4. divide()-------矩阵除法
  5. invert()--------矩阵求逆
  6. log()-----------矩阵求对数
  7. min()-----------两个矩阵计算最大值最小资
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {
	
	//以枚举形式赋值的矩阵
	Mat a = (Mat_<int>(3, 3) << 1, 2, 3, 4, 5,6,7,8,9);
	Mat b = (Mat_<int>(3, 3) << 1, 2, 3, 7,8,9,4,5,6);
	Mat c = (Mat_<double>(3, 3) << 1.0, 2.1, 3.2, 4.3, 5.1,6.2,7.4,8.8,9.1);
	Mat d = (Mat_<double>(3, 3) << 1.0, 2.1, 3.2, 4.3, 5.1, 6.2, 7.4, 8.8, 9.1);
	

	cout << "两个矩阵相加为:" << endl;
	cout<< a + b << endl;
	cout << "两个矩阵相减为:" << endl;
	cout <<  c - d << endl;
	cout << "矩阵数乘为:" << endl;
	cout << 2 * a << endl;
	cout << "矩阵数除为:" << endl;
	cout << d /2.0 << endl;
	cout << "矩阵数减为:" << endl;
	cout << a-2 << endl;
	cout << "两个矩阵相乘为:" << endl;
	cout << c * d << endl;
	cout << "两个矩阵内积为:" << endl;
	cout  <<a.dot(b) << endl;
	cout << "两个矩阵对应位相乘为:" << endl;
	cout  << a.mul(b) << endl;
	cout << "两个矩阵最小值为:" << endl;
	cout  << min(a,b) << endl;	
	return 0;
}

结果展示:

两个矩阵相加为:
[2, 4, 6;
 11, 13, 15;
 11, 13, 15]
两个矩阵相减为:
[0, 0, 0;
 0, 0, 0;
 0, 0, 0]
矩阵数乘为:
[2, 4, 6;
 8, 10, 12;
 14, 16, 18]
矩阵数除为:
[0.5, 1.05, 1.6;
 2.15, 2.55, 3.1;
 3.7, 4.4, 4.55]
矩阵数减为:
[-1, 0, 1;
 2, 3, 4;
 5, 6, 7]
两个矩阵相乘为:
[33.71, 40.97, 45.34;
 72.11, 89.60000000000001, 101.8;
 112.58, 140.5, 161.05]
两个矩阵内积为:
258
两个矩阵对应位相乘为:
[1, 4, 9;
 28, 40, 54;
 28, 40, 54]
两个矩阵最小值为:
[1, 2, 3;
 4, 5, 6;
 4, 5, 6]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值