Mat的复制

转自:http://blog.csdn.net/patkritlee/article/details/52782086

OpenCV中使用Mat,经常会碰到这样一种场景,会想拷贝一份Mat,并对新的Mat进行操作。但是OpenCV中的clone()和直接赋值都会导致共享数据区,也就是相当于&。

而使用copy,才会获取新的Mat。

 1 #include <iostream>
 2 #include <highgui.h>
 3
 4 using namespace std ;
 5 using namespace cv ;
 6
 7 int main()
 8 {
 9     Mat image = imread("1.png" , 0) ;
10
11     //Mat image1(image) ;//仅是创建了Mat的头部分,image1与image共享数据区
12     //Mat image1 = image ;//仅是创建了Mat的头部分,image1与image共享数据区
13     //Mat image1 = image.clone() ;//完全拷贝,把image中的所有信息拷贝到image1中
14     Mat image1 ;
15     image.copyTo(image1) ;//拷贝image的数据区到image1中,在拷贝数据前会有一步:image1.create(this->size , this->type)
16     for(int h = 0 ; h < image1.rows ; ++ h)
17     {
18         uchar* ptr = image1.ptr(h) ;
19         for(int w = 0 ; w < image1.cols ; ++ w)
20         {
21             ptr[w] = 0 ;
22         }
23     }
24     imshow("image" , image) ;
25     imshow("image1" , image1) ;
26     waitKey() ;
27     return 0 ;
28 }    
时间: 2024-08-11 07:40:33

Mat的复制的相关文章

opencv中Mat类型数据操作与遍历

Mat作为opencv中一种数据类型常常用来存储图像,相对与以前的IplImgae类型来说,Mat类型省去了人工的对内存的分配与释放,转而自动分配释放.Mat Class主要包括两部个数据部分:一个是matrix header(包括matrix的大小尺寸,储存方法,储存地址等等..),另一个是指向存储像素值的矩阵的指针. Opencv中对Mat的复制分为两种, Mat A, C; // creates just the header parts A = imread(argv[1], CV_LO

OpenCv学习笔记(一)----OpenCv中Mat类源码的详细解读(2)

(一)像素存储的方法 1--本节我们讲解如何存储像素,存储像素值,需要指定: 1--颜色空间 2--数据类型 2--其中,颜色空间是指针对一个给定的颜色,如何组合颜色以其编码. 3--最简单的颜色空间是----灰度级空间----只需要处理:黑色和白色,对它们进行组合便可以产生不同程度的灰 色(256灰度级) 4--对于彩色方式---则有更多种类的颜色空间,但不论那种方式,都是把颜色分成:三个或者四个---基元素,通过 组合基元素,就可以产生所有的颜色 1--RGB颜色空间是最常用的一种颜色空间,

使用QT5绘制OpenCV3的Mat图像

QT在跨平台编程中应用越来越广泛,C++中用跨平台开发界面(包括嵌入式设备),QT基本成为第一选择,OpenCV从3.0开始已经慢慢抛弃了过去的C接口,统一改为C++接口,存储图像的IplImage也在被Mat替代,本文主要讲如何使用QT绘制Mat. 在QT中用QImage存放图像,QImage有多种使用方法,本文讲解QImage的内存分配和将Mat高效复制到QImage中. 一 首先初始化QImage空间 int pixSize = 3; //像素大小 RGB888就是三个字节 uchar *

MATLAB安装libsvm无法使用解决办法(转)

buaasuozi  这是原作者: 安装libsvm 不成功有可能是你的MATLAB版本或者是编译文件版本的问题,但是不要急着换其他版本....说不定就有别的解决办法呢 首先感谢Lin教授及其实验室提供的libsvm工具箱,原始下载地址:下载主页:http://www.csie.ntu.edu.tw/~cjlin/libsvm/       下载地址:http://www.csie.ntu.edu.tw/~cjlin/libsvm/#download 原本我使用的是libsvm-3.01版本,但

转:利用ffmpeg和opencv进行视频的解码播放

引子 OpenCV中有自己的用于处理图片和视频的类 VideoCapture ,可以很方便的读入文件和显示. 现在视频数据流是ffmpeg解码h264文件得到的,由于要依赖该数据源进行相应的后续处理,所以需要将ffmpeg中得到的数据缓存转换成可以被OpenCV处理的Mat类对象. ffmpeg介绍 FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库

利用ffmpeg和opencv进行视频的解码播放

引子 OpenCV中有自己的用于处理图片和视频的类VideoCapture,可以很方便的读入文件和显示. 现在视频数据流是ffmpeg解码h264文件得到的,由于要依赖该数据源进行相应的后续处理,所以需要将ffmpeg中得到的数据缓存转换成可以被OpenCV处理的Mat类对象. ffmpeg介绍 FFmpeg是一个开源免费跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证(依据你选择的组件).它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库li

图像引用传值

当复制一副图像时,利用函数cv::Mat::clone(),则将在内存中重新开辟一段新的内存存放复制的图像(图像数据也将全部复制),而如果利用cv::Mat::copyTo()复制图像,则不会在内存中开辟一段新的内存块,同时也不会复制图像数据,复制前后的图像的指针指向同一个内存块.使用的时候需注意两个函数的区别. 为了避免函数参数传递时出现复制情况,函数的形参多采用传递reference(引用),如cv::Mat &image,传递输入图像的引用,不过这样函数可能会对输入图像进行修改,并反映到输

matlab libsvm支持向量机工具箱安装与使用

http://download.csdn.net/my这里可以下载支持向量机工具箱,本人maltab R2012B 和3.1匹配使用,其他的不行,大家在看着教程出现问题后,如果本文没有提到,先搜索错误,如果没有明确给出答案,多尝试不同的版本也许就可以用了,我的就是一样的教程换了4个工具箱后才可以使用(版本问题). 首先是下载好安装压缩包,我这里下载的是libsvm-3.1.zip,下载好,解压,然后将其放到MATLAB安装文件夹toolbox文件夹下,这里说明一点:并不是必须要到这个文件夹下,只

OpenCv学习笔记(四)--Mat基本图像容器Mat对象信息头,矩阵体的创建,深复制,浅复制详解

1--我们知道Mat是一个图像容器类,这个数据结构由两部分组成: 1--矩阵头--即class Mat类所实例化的类对象所开辟的空间里面存储的数据---就是这个矩阵的信息,当我们以 Mat object;这样声明类对象的时候,也仅仅是创建了一个Mat的信息头,并没有创建矩阵体,也就是说,我们并 没有给将要存储的图像开辟相应的空间 2--矩阵头--包含: 1--矩阵的尺寸----比如---class Mat这个类中的----数据成员rows,cols---就可以指定图像的尺寸 2--存储方法---