OpenCV4每日一练day4:Mat类的创建、赋值、读取

一.了解Mat类

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二.三种常用Mat类的创建方式:

创建Mat类的rows和cols参数是从1开始数
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Mat.rowRange(int x,int y)和Mat.rowRange(range(int x,int y)得到的结果一样,函数取的实际行数y-x,只取到范围的左边界,而不取右边界。

三.Mat类的赋值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四.示例:

在这里插入图片描述
运行结果:
在这里插入图片描述
附上例代码:

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

using namespace std;
using namespace cv;

int main()
{
    
    
	system("color F0");//把运行结果窗口处的界面由黑色变成白色
	Mat a(3, 3, CV_8UC1);      //Mat类的创建(利用矩阵宽、高和类型参数)创建一个行为3,列为3的单通道矩阵
	Mat b(Size(4, 4), CV_8UC1);//Mat类的创建(利用矩阵Size()结构和类型参数)创建一个行为3,列为3的单通道矩阵

	Mat c0(5, 5, CV_8UC3, Scalar(0, 0, 255));//Mat类的赋值(创建时赋值):创建一个三通道矩阵,每个像素都是0,0,255
	Mat c1(5, 5, CV_8UC2, Scalar(0, 255));   //Mat类的赋值(创建时赋值):创建一个双通道矩阵,每个像素都是0,255
	Mat c2(5, 5, CV_8UC1, Scalar(255));      //Mat类的赋值(创建时赋值):创建一个单通道矩阵,每个像素都是255

	Mat d = (cv::Mat_<int>(1, 5) << 1, 2, 3, 4, 5);  //Mat类的赋值(枚举法赋值)
	Mat e = Mat::diag(d); 					         //Mat类的赋值(类方法赋值)
	Mat f = Mat(e, Range(2, 4), Range(2, 4));        //Mat类的创建(利用已有Mat类创建新的Mat类),从e中截取部分数据构造f

	cout << "a=" << endl << a << endl << endl;
	cout << "b=" << endl << b << endl << endl;
	cout << "c0="<< endl << c0<< endl << endl;
	cout << "c1="<< endl << c1<< endl << endl;
	cout << "c2="<< endl << c2<< endl << endl;
	cout << "d=" << endl << d << endl << endl;
	cout << "e=" << endl << e << endl << endl;
	cout << "f=" << endl << f << endl << endl;
	system("pause");
	return 0;
}

五.Mat类的读取

在这里插入图片描述
在这里插入图片描述
读取Mat矩阵元素的row和col参数是从0开始数

1.

在这里插入图片描述

2.

在这里插入图片描述

六.示例:

在这里插入图片描述
运行结果:
在这里插入图片描述
附上例代码:

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

using namespace std;
using namespace cv;

int main()
{
    
    
	system("color F0");//把运行结果窗口处的界面由黑色变成白色

	Mat a = (cv::Mat_<int>(3,3) << 1,2,3,4,5,6,7,8,9);  //Mat类的赋值(枚举法赋值)

	Mat c1(5, 5, CV_8UC2, Scalar(4, 5));   //Mat类的赋值(创建时赋值):创建一个双通道矩阵,每个像素都是0,255
	Mat c2(3, 3, CV_8UC3, Scalar(4, 5, 6));//Mat类的赋值(创建时赋值):创建一个三通道矩阵,每个像素都是0,0,255

	cout << a.at<int>(0, 0) << endl;

	Vec2b vc = c1.at<Vec2b>(0, 1);
	cout << vc << endl;
	cout << (int)vc[0] << endl;
	cout << vc[1] << endl;//没有读出来

	cout << c2 << endl;
	cout << (double)(*(c2.data + c2.step[0] * 1 + c2.step[1] * 2 + 2)) << endl;//第1行第2列第2个通道(从0开始数的)

	system("pause");

	return 0;
}

七.Mat支持的运算

这里列举几个,OpenCV提供的函数远不止此:
在这里插入图片描述
要会查找OpenCV官方提供的函数说明文档:https://docs.opencv.org/
当具体遇到哪一个需要的函数时现查现用
在这里插入图片描述

1.四则运算

在这里插入图片描述

2.提供的运算函数

在这里插入图片描述

八.示例:

在这里插入图片描述
运行结果:
在这里插入图片描述
附上例代码:

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

using namespace std;
using namespace cv;

int main()
{
    
    
	system("color F0");//把运行结果窗口处的界面由黑色变成白色

	Mat a = (cv::Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
	Mat b = (cv::Mat_<int>(3, 3) << 1, 2, 3, 7, 8, 9, 4, 5, 6);
	Mat c = (cv::Mat_<double>(3, 3) << 1.0, 2.1, 3.2, 4.0, 5.1, 6.2, 2, 2, 2);
	Mat d = (cv::Mat_<double>(3, 3) << 1.0, 2.1, 3.2, 4.0, 5.1, 6.2, 2, 2, 2);

	cout << "两个矩阵的和=" << endl << a + b << endl;
	cout << "两个矩阵的差=" << endl << c - d << endl;
	cout << "矩阵数乘" << endl << 2 * a << endl;
	cout << "矩阵数除" << endl << d / 2.0 << endl;
	cout << "矩阵数减" << endl << a - 1 << endl;
	cout << "两矩阵相乘" << endl << c*d << endl;
	cout << "矩阵内积" << endl << a.dot(b) << endl;
	cout << "矩阵对应位相乘" << endl << a.mul(b) << endl;
	cout << "两个矩阵最小值" << endl << min(a, b) << endl;

	system("pause");

	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43297891/article/details/114370374