昊虹AI笔记网

 找回密码
 立即注册
搜索
查看: 7921|回复: 0
收起左侧

OpenCV_Mat类对象常用的构造方法及初始化方法

[复制链接]

251

主题

254

帖子

1147

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1147
昊虹君 发表于 2022-10-16 06:48 | 显示全部楼层 |阅读模式
OpenCV_Mat类对象常用的构造方法及初始化方法

OpenCV_Mat类对象常用的构造方法及初始化方法如下:

目录
  • 01-Mat::Mat()
  • 02-Mat::Mat(int rows, int cols, int type)
  • 03-Mat::Mat(Size size, int type)
  • 04-Mat::Mat(int rows, int cols, int type, const Scalar& s)
  • 05-Mat::Mat(Size size, int type, const Scalar& s)
  • 06-Mat::Mat(const Mat& m)
  • 07-初始化一个所有元素值都为零的矩阵
  • 08-初始化一个所有元素值都为1的矩阵
  • 09-初始化一个单位矩阵(对角线元素为1)
  • 10-初始化矩阵的每一个元素为不同的任意值(利用重载运算符<<)
  • 11-通过别的Mat对象的属性值创建一个新的Mat对象
  • 12-复制别的Mat对象的某个区域形成新的Mat对象

01-Mat::Mat()
无参数的构造方法

02-Mat::Mat(int rows, int cols, int type)
创建行数为rows,列数为cols,类型为type的图像。
关于参数type的可取值及意义,可参见页面 https://www.hhai.cc/thread-72-1-1.html

03-Mat::Mat(Size size, int type)
创建大小为size,类型为type的图像。

04-Mat::Mat(int rows, int cols, int type, const Scalar& s)
创建行数为rows,列数为cols,类型为type的图像,并将所有元素初始化为s。

05-Mat::Mat(Size size, int type, const Scalar& s)
创建大小为size,类型为type的图像,并将所有元素初始化为s。

06-Mat::Mat(const Mat& m)
将对象m赋值给新创建的对象,此时不会对图像数据进行复制,对象m和新对象共用图像数据。

以上六种构造方法的示例代码如下:
[C++] 纯文本查看 复制代码
//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术

//博主微信/QQ 2487872782
//QQ群 271891601
//欢迎技术交流与咨询

//OpenCV版本 OpenCV3.0

#include <opencv2/opencv.hpp>

#include <iostream>
int main()
{
	// 方法1:创建无初始化矩阵
	cv::Mat image1;

	// 方法2:创建大小为2x3,数据类型为8位无符号整数的单通道矩阵
	cv::Mat image2(2, 3, CV_8UC1);

	// 方法3:创建大小为3x2,数据类型为8位无符号整数的三通道矩阵
	cv::Mat image3(cv::Size(2, 3), CV_8UC1);

	// 方法4:创建大小为2x3,数据类型为32位浮点型的两通道矩阵,两个通道的数据初始值分别为1和2
	cv::Mat image4(2, 3, CV_32FC2, cv::Scalar(1, 2));

	// 方法5:创建大小为3x2,数据类型为8位无符号的三通道矩阵,三个通道的数据初始值分别为1、2、3
	cv::Mat image5(cv::Size(2, 3), CV_8UC3, cv::Scalar(1, 2, 3));

	//方法6:创建Mat对象image6,由于是引用传递,所以image6和image2共用内存空间。
	cv::Mat image6(image2);

	// 输出矩阵结果
	std::cout << "imag1的数据如下:\n" << image1 << std::endl << std::endl;
	std::cout << "imag2的数据如下:\n" << image2 << std::endl << std::endl;
	std::cout << "imag3的数据如下:\n" << image3 << std::endl << std::endl;
	std::cout << "imag4的数据如下:\n" << image4 << std::endl << std::endl;
	std::cout << "imag5的数据如下:\n" << image5 << std::endl << std::endl;
	std::cout << "imag6的数据如下:\n" << image6 << std::endl << std::endl;
	return 0;
}


运行结果如下图所示:

从上面的运行结果我们可以看出,Mat对象的数据如果没有指定初始值,那么其值为205,注意不是255。
要特别注意的地方是:使用cv::Size()设定大小时,第一个参数是指矩阵有多少列,第二个参数是指矩阵有多少行,即cv::Size(width,height),比如上面代码中的方法3和方法5。


07-初始化一个所有元素值都为零的矩阵
可利用Mat类的成员函数Mat::zeros()实现初始化一个所有元素值都为零的矩阵
示例代码如下:
[C++] 纯文本查看 复制代码
//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术

//博主微信/QQ 2487872782
//QQ群 271891601
//欢迎技术交流与咨询

//OpenCV版本 OpenCV3.0

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

using namespace std;
using namespace cv;

int main()
{
	//创建两行三列的零矩阵
	Mat A1 = Mat::zeros(2, 3, CV_8UC1);

	cout << "A1中的数据为:\n" << A1 << endl << endl;


	return(0);
}


运行结果如下图所示:



08-初始化一个所有元素值都为1的矩阵
可利用Mat类的成员函数Mat::ones()实现初始化一个所有元素值都为1的矩阵
成员函数Mat::ones()的使用与上一个Mat::zeros()的使用完全相同,这里就不给示例代码了。

09-初始化一个单位矩阵(对角线元素为1)
可以用函数setIdentity()实现初始化一个单位矩阵,
详细介绍见官方文档链接,官方文档链接如下:
https://docs.opencv.org/4.4.0/d2 ... a277ceb98ccaa327c99

10-初始化矩阵的每一个元素为不同的任意值(利用重载运算符<<)

示例代码如下:
[C++] 纯文本查看 复制代码
//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术

//博主微信/QQ 2487872782
//QQ群 271891601
//欢迎技术交流与咨询

//OpenCV版本 OpenCV3.0

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

using namespace std;

int main()
{

	cv::Mat A1 = (cv::Mat_<uchar>(3, 3) <<	1, 2, 3,
											4, 5, 6,
											7, 8, 9);


	cv::Mat B1 = (cv::Mat_<float>(3, 3) <<	0.1, 0.2, 0.3,
											0.4, 0.5, 0.6,
											0.7, 0.8, 0.9);

	cv::Mat C1 = (cv::Mat_<double>(3, 3) << 0.1, 0.2, 0.3,
											0.4, 0.5, 0.6,
											0.7, 0.8, 0.9);

	cout << "A1中的数据为:\n" << A1 << endl << endl;
	cout << "B1中的数据为:\n" << B1 << endl << endl;
	cout << "C1中的数据为:\n" << C1 << endl << endl;


	return(0);
}


运行结果如下:

注意B1的数据类型为float类型,C1的数据类型为double类型。这导致了它们输出值的不同,从提高精度的角度来说,咱们能用double型就用double型。


11-通过别的Mat对象的属性值创建一个新的Mat对象

示例代码如下:
[C++] 纯文本查看 复制代码
//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术

//博主微信/QQ 2487872782
//QQ群 271891601
//欢迎技术交流与咨询

//OpenCV版本 OpenCV3.0

#include <opencv2/opencv.hpp>

#include <iostream>
using namespace std;

int main()
{

	cv::Mat A1 = (cv::Mat_<float>(2, 3) << 1, 200, 3, 4, 5, 6);
	cout << "A1中的数据为:\n" << A1 << endl << endl;

	cv::Mat B1(A1.size(), A1.type(), cv::Scalar(1));
	cout << "B1中的数据为:\n" << B1 << endl << endl;



	return(0);
}


运行结果如下:


12-复制别的Mat对象的某个区域形成新的Mat对象
关于这个,请大家参考页面 https://www.hhai.cc/thread-127-1-1.html 打开页面后搜索关键词“Mat ROI_img” 即可找到相关示例代码。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|昊虹AI笔记网 ( 蜀ICP备2024076726 )

GMT+8, 2025-11-15 07:26 , Processed in 0.024121 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表