在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);
Mat img1 = eye(100,100,CV_8UC3);
Mat img2 = ones(100,100,CV_8UC3);
2.4 使用逗号数组创建对象
Mat img = (Mat_<double>(2,2) << 0,1,1,0);
2.5 图像复制方法创建对象
请见1 图像复制中的内容
后续有新内容会持续更新。。。。。。
|