在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 图像复制中的内容

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

来源:PRML_MAN

物联沃分享整理
物联沃-IOTWORD物联网 » OpenCV之Mat的详细介绍

发表评论