图像对象的创建与赋值-3

一、代码部分

(1)头文件中声明函数

#include<opencv2/opencv.hpp>

using namespace cv;

class QuickDemo
{
public:
	void colorSpace_Demo(Mat& image);
	void mat_creation_demo(Mat& image); // 图像对象的创建与赋值-3
};

 (2)quickdemo.cpp中添加函数

// Mat相关
void QuickDemo::mat_creation_demo(Mat& image)
{
	Mat m1, m2;
	m1 = image.clone(); // 克隆  克隆和拷贝都是深拷贝,赋值是浅拷贝
	image.copyTo(m2); // 拷贝
	imshow("clone_copy", m2);

	// 创建空白图像
	Mat m3 = Mat::zeros(Size(500, 500), CV_8UC3);// 8位 无符号  单通道
	// 赋值操作
	// m3 = 127; 只有第一个通道是127
	// 对m3进行赋值
	m3 = Scalar(125, 200, 0);
	// 输出高度和宽度以及通道数
	std::cout << "width:" << m3.cols <<  " height:" << m3.rows <<  " channels:" << m3.channels() << std::endl;
	//std::cout << m3 << std::endl; // 输出的是矩阵
	// 显示自自己创建的图像

	Mat m4 = m3; // 重载运算符=是浅拷贝,共享内存空间,互相影响。clone与copy是深拷贝,内存空间不同,相互独立,互不打扰。
	m4 = Scalar(0, 255, 255);
	imshow("personimage", m3);
}

 (3)main函数中添加mat_creation_demo

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

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	
	Mat src = imread("D:\\Deeyea\\Learning\\cat.jpg"); // 8位,通道为B G R
	if (src.empty())
	{
		printf("无法加载图片\n");
	}
	//namedWindow("show", WINDOW_FREERATIO);
	
	imshow("image", src);

	QuickDemo qd;// 创建对象
	qd.mat_creation_demo(src); // 图像对象的创建与赋值
	waitKey(0); 
	destroyAllWindows;
	return 0;
}

结果如下图所示: 

 二、相关知识总结

1、Mat类

 Mat类是OpenCV中的一个非常重要的类,Mat类用于表示一个多维的单通道或者多通道的稠密数组。能够用来保存实数或复数的向量、矩阵,灰度或彩色图像,立体元素,点云,张量以及直方图。简而言之,Mat就是用来保存多维的矩阵的。

Mat类有两个数据部分:矩阵头(包含矩阵的大小,存储方法和存储地址等)和一个指针,指向包含像素值的矩阵地址。矩阵头的存储空间是常数,矩阵本身的尺寸随着图像大小改变。

矩阵的拷贝、赋值运算符通常只赋值矩阵头和矩阵指针,但不是矩阵本身,即采用浅拷贝来提高效率。

创建对象

1.1构造函数

Mat image(3,3,CV_8UC3,Scalar(50,100,200))

1.2 create()创建对象

Mat image;
image.create(500,500,CV_8UC3); // 使用create创建Mat对象时无法初始化,可使用Scalar()
例:
Mat m1;
m1.create(500,500,CV_8UC3);
m1 = Scalar(50,100,150);
imshow("m1",m1);

 1.3 zeros()、eye()、ones()创建对象

Mat image = Mat::zeros(500,500,CV_8UC3); // 元素全部为0的矩阵
Mat image = Mat::eye(500,500,CV_8UC3); // 对角线为1的矩阵
Mat image = Mat::ones(500,500,CV_8UC3); // 元素全为1的矩阵

 1.4 赋值创建对象

image = (Mat_<int>(2,3) << 1,2,3,4,5,6); // 赋值法

 1.5 构造方法

Mat image = Mat::Mat();
// 无参构造
Mat image = Mat::Mat(int rows,int cols,int type,const Scalar& s);
// 行数为rows,列数为cols,类型为type的图像,并将所有元素初始化为s
Mat image = Mat::Mat(size size,int type,const Scalar& s); 
// 尺寸大小为size,类型为type的图像,并将所有元素初始化为s
Mat image = Mat::Mat(const Mat& img);
// 将img赋值给新创建的对象,不会对img数据进行复制,与新对象共享图像数据

 2、深拷贝与浅拷贝

深拷贝和浅拷贝的区别:浅拷贝主要是对指针的拷贝,拷贝后两个指针指向同一个内存空间,修改其中一个会影响另一个。深拷贝需要不但对指针进行拷贝,并对指针指向的内容进行拷贝,经过深拷贝后的指针是指向两个不同地址的指针,修改数据是互不影响。

2.1 浅拷贝

2.1.1拷贝构造函数

Mat image = imread("image.jpg"); // 路径要加双斜杠,不要忽略文件名
Mat image2(image);

 2.1.2赋值运算符

Mat image = imread("image.jpg");
Mat image2 = image;

 2.1.3Rect函数截取

Mat image = imread("image.jpg");
Mat image2(image,Rect(10,10,100,100));

2.2 深拷贝 

2.2.1clone()函数

Mat image = imread("image.jpg");
Mat image2 = image.clone();

2.2.2copyTo()

Mat image = imread("image.jpg");
Mat image2;
image.copyTo(image2);

 相关参考:

(1)OpenCV之Mat的详细介绍_PRML_MAN的博客-CSDN博客_mat opencv

(2)openCV学习(一)——Mat类详解_绿芽儿_sunry的博客-CSDN博客_opencvmat类

(3)https://www.jianshu.com/p/181c69a65b0e 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值