OpenCV中图像的浅拷贝与深拷贝

10人阅读 评论(0) 收藏 举报


这里先学习OpenCV中的一个函数:

void flip(InputArray src, OutputArray dst, int flipCode)
//图像变换函数,第三个参数为1时,表示水平反转,0表示垂直反转,负数表示既有水平又有垂直反转。

为介绍OpenCV中的浅拷贝,我们还是从cv::Mat说起吧。cv::Mat类是用于保存图像以及其他矩阵数据的数据结构。当cv::Mat实例化后,分配内存;当对象离开作用域后,分配的内存自动释放。cv::Mat实现了引用计数以及浅拷贝。引用计数的作用是只有当所有引用内存数据的对象都被析构后,内存才会释放。浅拷贝是指当图像之间进行赋值时,图像数据并未发生复制,而是两个对象都指向同一块内存块。
通过OpenCV中的flip函数验证浅拷贝,具体做法:

先声明一个Mat对象img加载本地图片,并显示;
然后声明一个Mat对象img1,将img浅拷贝到img1;
在img1上垂直翻转图片,注意是在原地进行操作,不创建新的图像;
显示img,注意窗口名称应与之前不相同,观察img的图像内容是否改变。

程序如下:

#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

int main()
{
    Mat img1=imread("test.jpg");  //将任意一张名为test.jpg的图片放置于工程文件夹test中
    Mat img2=img1;                //拷贝方式为浅拷贝
    imshow("First",img1);
    if(!img1.data)
    {
        cout<<"error! The image is not built!"<<endl;
        return -1;
    }
    flip(img2,img2,1);            //注意应在原地进行镜像变换
    imshow("Second",img1);
    waitKey();
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

运行如下,很显然,我们修改img1的内容img发生了改变。
这里写图片描述

深拷贝是指新创建的图像拥有原始图像的崭新拷贝,即拷贝图像和原始图像在内存中存放在不同地方。OpenCV中可以通过下面两种方式实现深拷贝。

1) img.copyTo(img1)
2) img1=img.clone()

通过OpenCV中的flip函数验证深拷贝,具体做法与之前相似,将img深拷贝到img1即可。
程序如下:

#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

int main()
{
    Mat img1=imread("test.jpg");  //将任意一张名为test.jpg的图片放置于工程文件夹test中
    Mat img2=img1.clone();        //拷贝方式是深拷贝
    imshow("First",img1);
    if(!img1.data)
    {
        cout<<"error! The image is not built!"<<endl;
        return -1;
    }
    flip(img2,img2,1);
    imshow("Second",img1);
    waitKey();
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

运行如下,深拷贝之后,任他img1七十二变,img自然不变。
这里写图片描述

了解了图像的深浅拷贝,我们使用时就要注意,尤其涉及到类时,我们应该避免返回类中的图像成员。

查看评论

opencv 中的浅拷贝和深拷贝

(1)浅拷贝:   Mat B;   B = image  // 第一种方式   Mat C(image); // 第二种方式 这两种方式称为浅copy,是由于它们有不同的矩阵...
  • xiaxiazls
  • xiaxiazls
  • 2015-11-24 20:39:14
  • 2761

opencv浅拷贝与深拷贝

1、当我将摄像头捕获到的的一帧图片赋值给srcImage时,如下所示: *videoCap >> srcImage; 2、在不同时刻取出两张图 Mat_imageL = srcImage; ...
  • u012283902
  • u012283902
  • 2015-10-25 22:51:26
  • 508

OpenCV图像拷贝方法与注意点(=、copy、clone)

下面介绍三种OpenCV复制图像的方法:方法1:直接赋值使用用赋值运算符“=”进行的拷贝是一种浅拷贝,虽然它们有不同的矩阵头,但是二者共享相同的内存空间,二者内容相互关联,任何一个变量变化的同时另一个...
  • MengchiCMC
  • MengchiCMC
  • 2017-04-07 16:09:57
  • 882

【计算机视觉】【图像处理】【VS开发】【Qt开发】opencv之深拷贝及浅拷贝,IplImage装换为Mat

原文:opencv之深拷贝及浅拷贝,IplImage装换为Mat  一、(1) 浅拷贝: Mat B; B = image // 第一种方式 Mat C(image); // 第二...
  • LG1259156776
  • LG1259156776
  • 2016-09-08 11:03:13
  • 688

【opencv学习笔记六】图像的ROI区域选择与复制

 图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI。今天我们来看一下如何设置图像的感兴趣区域ROI。以及对ROI区域图...
  • nicewe
  • nicewe
  • 2018-02-08 15:06:46
  • 180

JavaScript浅拷贝与深拷贝浅析

在JavaScript中,变量的拷贝是无处不在的,而且也是不可或缺的,我们常常使用框架自带的拷贝方法,比如angular1.x自带的,angular.copy(),有时候却不知道使用纯JavaScri...
  • GongZhongNian
  • GongZhongNian
  • 2017-08-17 16:55:59
  • 247

Python中深拷贝与浅拷贝的区别:

Python中深拷贝与浅拷贝的区别:
  • u014745194
  • u014745194
  • 2017-04-20 16:58:35
  • 2984

一看就懂的,java深拷贝浅拷贝

前言 这两天,男票兴奋地通知我,我的博客终于有排名了,刚好是20000名,原来都是千里之外。我也比较兴奋,在这里谢谢每一个看到我文章的同学。O(∩_∩)O哈哈~,为什么有一种颁奖典礼的赶脚。真的啦,...
  • XIAXIA__
  • XIAXIA__
  • 2014-12-01 21:56:31
  • 7790

java的深拷贝与浅拷贝

转载:http://www.2cto.com/kf/201401/273852.htmlJava中对象的创建clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象。...
  • lcg910978041
  • lcg910978041
  • 2016-07-22 10:46:02
  • 9166

JavaScript深拷贝与浅拷贝的区别

JavaScript深拷贝与浅拷贝的区别 注:深浅拷贝的区别只适用于array【数组】与object【对象】 一、数组Array1、拷贝情况 浅拷贝:相当于使两个数组指针指向相同的地址,任一个数组...
  • Vivian_jay
  • Vivian_jay
  • 2017-02-27 18:04:14
  • 987
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 1385
    排名: 3万+
    文章分类
    最新评论