关于OpenCV中Mat对象

本文主要介绍了OpenCV库中Mat对象的各种初始化方法,包括无参构造、指定大小和类型、通过Scalar赋值、使用create函数、Matlab风格初始化、通过数组指针构造以及定义数组形式的初始化。此外,还探讨了Mat对象的部分复制和完全复制,指出部分复制时不同对象间的数据共享特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.各种初始化

1.Mat()

	//1.Mat()
	Mat p1 = Mat();
	cout << p1;
	namedWindow("output1");
//	imshow("output1", p1);

运行结果:
在这里插入图片描述
若去掉、// imshow(“output1”, p1);的注释就会报错,(以后补充)

2.Mat(Size size, int type)

	//2.Mat(Size size, int type)
	Mat p2;
	p2 = Mat(src.size(), src.type());
	cout << src.size() << endl << src.type() << endl;
	p2 = Scalar(0, 0, 255);
	cout << p2 << endl;
	namedWindow("output2");
	imshow("output2", p2);

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

3.最常用的 Mat(int rows,int cols, int type, const Scalar &s)
type 详解 CV_[位数][带符号与否][类型前缀]C[通道数]
eg: CV_8UC3 表示使用 8位的unsigned char 型 每个像素由三个通道组成

//3.Mat(int rows,int cols, int type, const Scalar &s)
	Mat p3 = Mat(3, 3, CV_8UC3, Scalar(0, 0, 255));
	cout << p3 << endl;
	namedWindow("output3");
	imshow("output3", p3);

在这里插入图片描述
4..用create函数** 此方法不能赋初值

//4.create
	Mat p4;
	p4.create(4, 4, CV_8UC2);
	p4 = Scalar(0, 0);
	cout << p4 << endl;
	namedWindow("output4");
	
	imshow("output4", p4);

imshow的时候出错了

等待补充原因

5.Matlab式的初始化方式

    Mat p5 = Mat::eye(4, 4, CV_64F);
	cout << "p5 = " << endl << p5 << endl;

	Mat p6 = Mat::ones(2, 2, CV_32F);
	cout << "p6 = " << endl << p6 << endl; 
	
	Mat p7 = Mat::zeros(3, 3, CV_64F);
	cout << "p7 = " << endl << p7 << endl;

在这里插入图片描述

   namedWindow("output5");
	imshow("output5", p5);

	namedWindow("output6");
	imshow("output6", p6);

	namedWindow("output7");
	imshow("output7", p7);

正常显示

6.通过构造函数进行初始化(制定维数, 传递一个指向数组的指针(这个数组包含每个维度的尺寸),type类型, Scalar)

    int sz[2] = { 2, 2 };
	Mat p8(2, sz, CV_8UC1, Scalar::all(0));
	cout << p8 << endl;
	namedWindow("output8");
	imshow("output8", p8);

在这里插入图片描述
若为三维显示输出就会报错(可以定义,应该是不能这样输出)
在这里插入图片描述
7.定义数组的形式

    Mat p9 = (Mat_<double>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	cout << p9 << endl;
	namedWindow("output9");
	imshow("output9", p9);

在这里插入图片描述

二, 对mat对象的使用

1.部分复制 一般情况下只会复制头和指针,不会复制数据部分

2.完全复制 连同数据部分一起复制

//部分复制
	Mat a = imread("E://VS-pro//images//zhu.jpg");
	Mat b(a);

	//完全复制
	Mat c = a.clone();
	Mat d;
	//Mat mask = Mat::ones(a.cols, a.rows, CV_8UC1);
	a.copyTo(d);



	namedWindow("outputa");
	imshow("outputa", a);

	namedWindow("outputb");
	imshow("outputb", b);

	namedWindow("outputc");
	imshow("outputc", c);

	namedWindow("outputd");
	imshow("outputd", d);

部分复制中 使用它们中的任何一个进行修改也会影响所有其他的。在实践中,不同的对象只是向相同的底层数据提供不同的访问方法。
修改前
在这里插入图片描述
修改后

    Mat kernel = (Mat_<char>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
	filter2D(a, b, -1, kernel);

	filter2D(d, c, -1, kernel);

	namedWindow("outputa1");
	imshow("outputa1", a);

	namedWindow("outputb1");
	imshow("outputb1", b);

	namedWindow("outputc1");
	imshow("outputc1", c);

	namedWindow("outputd1");
	imshow("outputd1", d);

a随b变而变了 c变了 d没变

在这里插入图片描述

今日完结撒花==

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值