OpenCV之Mat的详细介绍

在opencv中,Mat作为图像的存储容器,是非常基础也是非常重要的知识,本文主要介绍Mat相关的操作。

1 图像复制

再开始将拷贝之前,先给大家分享一下浅拷贝深拷贝
浅拷贝:拷贝对象和被拷贝对象都指向同一个内存空间,修改任何一个对象的数据都会影响另外一个;
举个例子:小明和小红在沙漠中共用一个水瓶喝水,任何一个人喝了水,另外一个人都会剩下更少的水。

深拷贝:拷贝对象和被拷贝对象指向不同的内容空间,修改数据时互不影响。
举个例子:小明和小红各有一个水瓶,各自喝各自的水对对方不影响。

深拷贝和浅拷贝都各有优缺点:

优点缺点
浅拷贝拷贝效率高,空间利用率高,无需重新开辟空间不适用于拷贝和被拷贝对象同时修改的情况
深拷贝任何一方的修改都不影响另一个拷贝效率低,占用空间较多,影响性能
1.1 拷贝构造函数进行拷贝

这种拷贝方式属于浅拷贝,下面代码中的img和img2都指向相同的内存空间,修改img或者img2,另外一个中的变量也会跟着变化。

Mat img = imread("test.jpg", CV_LOAD_IMAGE_COLOR);
Mat img2(img); // 拷贝构造函数
1.2 赋值运算符进行拷贝

这种拷贝方式属于浅拷贝,下面代码中的img和img2都指向相同的内存空间,修改img或者img2,另外一个中的变量也会跟着变化。

Mat img = imread("test.jpg", CV_LOAD_IMAGE_COLOR);
Mat img2 = img; // 赋值运算符
1.3 使用Rect截取拷贝

这种拷贝方式属于浅拷贝,下面代码中的img2指向的内存空间为img的子内存空间。

Mat img = imread("test.jpg", CV_LOAD_IMAGE_COLOR);
Mat img2(img, Rect(200,200,300,300));
1.4 使用clone()函数拷贝

这种拷贝方式属于深拷贝,img和img2分别指向不同的内存空间,修改img或img2 的数据,不影响另一个变量。

Mat img = imread("test.jpg", CV_LOAD_IMAGE_COLOR);
Mat img2 = img.clone();
1.5 使用copyTo()函数拷贝

这种拷贝方式属于深拷贝,img和img2分别指向不同的内存空间,修改img或img2 的数据,不影响另一个变量。

Mat img = imread("test.jpg", CV_LOAD_IMAGE_COLOR);
Mat img2;
img.copyTo(img2);

2 创建Mat对象的方法

2.1 构造函数
Mat img(100,100,CV_8UC3, Scalar(255,255,255));
2.2 create()创建对象
Mat img;
img.create(100,100, CV_8UC3);
2.3 zeros(),eye(), ones()创建对象
Mat img = zeros(100,100,CV_8UC3); // 全0矩阵
Mat img1 = eye(100,100,CV_8UC3); // 对角为1的对角矩阵
Mat img2 = ones(100,100,CV_8UC3); // 全1矩阵
2.4 使用逗号数组创建对象
Mat img = (Mat_<double>(2,2) << 0,1,1,0); // 按行填充
2.5 图像复制方法创建对象

请见1 图像复制中的内容

后续有新内容会持续更新。。。。。。

  • 14
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OpenCV是一个基于开源许可的计算机视觉库,它包含了许多用于图像处理和计算机视觉的函数和类。在OpenCV中,Mat是一个非常重要的类,用于存储和处理图像数据。下面是关于OpenCV 4.x中Mat类的详细介绍Mat类是OpenCV中用于存储和处理图像数据的主要类,它是一个多维数组,可以表示单通道或多通道、灰度或彩色图像。Mat类中的数据可以在内存中连续或不连续存储,可以是有符号整数、无符号整数、浮点数等类型,支持大多数的像素格式。 在OpenCV中,Mat是一个模板类,可以根据需要定义不同类型的Mat对象。Mat类的构造函数有多个参数,包括行数、列数、数据类型等。可以使用Mat::zeros()函数和Mat::ones()函数来创建指定大小的全零或全一矩阵。还可以使用Mat::eye()函数来创建单位矩阵。 Mat类提供了许多用于操作图像的函数和方法,例如Mat::rows()和Mat::cols()方法可以返回Mat对象的行数和列数;Mat::at()方法可以访问Mat对象的指定像素点;Mat::clone()方法可以复制一个Mat对象;Mat::convertTo()方法可以将Mat对象的数据类型转换为指定类型;Mat::reshape()方法可以改变Mat对象的形状等。 Mat类还支持与其他Mat对象之间的运算,例如加、减、乘、除等。可以使用MatExpr类来表示这些运算,例如MatExpr e = Mat1 + Mat2;表示将Mat1和Mat2进行加法运算,得到一个MatExpr对象e。还可以使用Mat::operator()方法来对Mat对象进行切片和子矩阵操作。 总之,OpenCV中的Mat类是一个非常重要的类,它提供了许多用于图像处理和计算机视觉的功能和方法,可以帮助开发者更方便地进行图像处理和计算机视觉的开发工作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值