OpenCV中Mat操作clone() 与copyto()的区别

Mat深拷贝与浅拷贝 clone()会将矩阵的所有信息(包括头部和数据部分)都拷贝到目标矩阵中,也就是说并不会共享数据。 coyTo()会将矩阵的数据部分拷贝到目的矩阵,且在拷贝之前会调用creat()函数。 Mat clone() const; void copyTo( OutputArray m ) const; void copyTo( OutputArray m, InputArray mask) con... 阅读详情
// Mat is basically a class with two data parts: the matrix header and 
//a pointer to the matrix containing the pixel values 

#include <iostream>
#include <highgui.h>

using namespace std ;
using namespace cv ;

int main()
{
	Mat image = imread("1.png" , 0) ;
	
	//Mat image1(image) ;//仅是创建了Mat的头部分,image1与image共享数据区
	//Mat image1 = image ;//仅是创建了Mat的头部分,image1与image共享数据区
	//Mat image1 = image.clone() ;//完全拷贝,把image中的所有信息拷贝到image1中
	Mat image1 ;
	image.copyTo(image1) ;//拷贝image的数据区到image1中,在拷贝数据前会有一步:image1.create(this->size , this->type)
	for(int h = 0 ; h < image1.rows ; ++ h)
	{
		uchar* ptr = image1.ptr(h) ;
		for(int w = 0 ; w < image1.cols ; ++ w)
		{
			ptr[w] = 0 ;
		}
	}
	imshow("image" , image) ;
	imshow("image1" , image1) ;
	waitKey() ;
	return 0 ;
}


Mat-深拷贝函数 之前谈到过Mat的拷贝构造函数和以Mat为形参的赋值运算符都是在执行浅拷贝的操作,因为在拷贝或者赋值的时候只是重新开辟内存存储了信息头,而矩阵头的内容仍然是共享的。既然有浅拷贝那么就应该有深拷贝。下面介绍两个实现深拷贝的函数[1]和[2]的实现://! returns deep copy of the matrix, i.e. the data is copied [1]Mat clone( 阅读详情

相关推荐

OpenCV学习C++接口 Mat像素遍历详解

IplImage 学习总结:

chen 1万+

QImage与Mat相互变换

//##### cv::Mat ---&gt; QImage #####QImage cvMat_to_QImage(const cv::Mat &amp;mat ) {  switch ( mat.type() )  {     // 8-bit, 4 channel     case CV_8UC4:     {        QImage image( mat.data, mat.cols,...

DJAlove的博客 508

opencv和cv::Mat常用属性和函数

这篇文章包括: 1. opencv常用头文件及作用 2. cv::Mat常见初始化 3. cv::Mat常见属性 4. cv::Mat常见函数   clone()和copyTo()的区别 5.cv::Mat的RGB赋值(改颜色) 6.待续   1. opencv常用头文件: 1.1 最常用头文件: #include <opencv2/core/core.hpp> #incl...

踏雪飞鸿的博客 4989

opencv之图像mat复制copyTo,clone=

函数原型 Mat clone() const; void copyTo( OutputArray m ) const; void copyTo( OutputArray m, InputArray mask) const; copyTo()有重载, 对于你说的imge.clone()和imge.copyTo(result)这种情况,源码解释如下 inline Mat Mat::clon

小木匠的博客 4万+

OpenCV4学习笔记(1)——图像读取、复制和创建

开篇:作为一名光电信息科学与工程的在读大三学生,我选择了光电视觉方向,又对于图像处理方向感兴趣,所以开始了学习OpenCV的漫漫长路。因为疫情在家呆着,就来整理一下平时学习的笔记注释,借助优快云这个平台记录下我的学习日常,也有利于以后回顾知识点的方便。学习OpenCV其实有一段时间了,但是之前都是很零散的学习,而且是以python为主要学习语言,没有形成完整的知识体系,所以从上个月开始,我加入了...

邱小兵的博客 1601

MTK metadata中AF模块的移除与配置调整

本文详细介绍了在MTK平台Camera开发中如何移除metadata中的AF(自动对焦)模块。通过系统清理MTK_CONTROL_AF_REGIONS、MTK_CONTROL_MAX_REGIONS等关键配置项,并调整对焦模式及硬件特性声明,确保定制化设备在禁用自动对焦功能后的稳定运行。

q1w3e5r7t9y的博客 570

c语言cione图像库,c – 使用OpenCV的imread()从qrc中读取图像

正如@TheDarkKnight指出的那样,imread并不知道Qt资源.但是,您可以编写自己的加载器,使用QFile从资源中检索二进制数据,并使用imdecode(由imread内部完成)来读取图像:Mat loadFromQrc(QString qrc,int flag = IMREAD_COLOR){//double tic = double(getTickCount());QFile fi...

weixin_39669133的博客 234

生物信息学工具链搭建:用conda一键搞定MCScanX所有依赖(Ubuntu20.04实测)

本文详细介绍了在Ubuntu20.04系统上使用conda一键部署MCScanX及其所有依赖的高效方法,解决了传统源码编译安装中的依赖冲突问题。通过conda环境管理工具,研究者可以快速搭建生物信息学工具链,实现基因组共线性分析的高效运行,显著提升研究效率。

backprop5master的博客 248

OpenCV中Mat操作“ =“ 、clone() 与copyto()的区别

1、“=” 浅拷贝 浅拷贝 - 不复制数据只创建矩阵头,数据共享(更改a,b,c的任意一个都会对另外2个产生同样的作用) Mat a = imread("1.jpg"); Mat b = a; //a "copy" to b Mat c(a); //a "copy" to c a.col(10)=0;//把a的第十列全置0,b和c也相应发生变化 2、"clone()" 完全深拷贝 clone 是完全的深拷贝,在内存中申请新的空间 Mat A = Mat::ones(4,5,CV_32..

my_angle2016的博客 2094

保姆级避坑指南:在Ubuntu 22.04上从零编译Autoware.universe(含ROS2 Humble和CUDA配置)

本文提供了一份详细的Autoware.universe编译指南,涵盖Ubuntu 22.04系统优化、ROS2 Humble安装避坑、CUDA配置及Demo运行技巧。通过分步操作和实战经验,帮助开发者高效完成环境搭建,避免常见错误,提升自动驾驶开发效率。

weixin_30642561的博客 352

Ubuntu22.04下安装LDAP

在Ubuntu22.04的时候可以使用apt的方式来安装,在安装LDAP的web 服务器的时候可以考虑选择 LDAP 帐户管理器 (LAM)。因为 PHPLDAPadmin 安装时需要 php 的环境依赖,相对来说安装麻烦。此外在 PHPLDAPadmin 中创建组织和用户时与平常的语法有很大不同,对新手来说不友好。

dl_11的博客 3944

OpenCV中图像Mat常用的浅拷贝和深拷贝操作和区别传值、传引用、clone()、copyto()

在OpenCV中,Mat类使用非常广泛,对于Mat容器的拷贝方式将对程序运行效率产生很大的影响,在Mat中效率最高的浅拷贝,效率较低的是深拷贝。 1.什么是深拷贝和浅拷贝? 深拷贝:将数据拷贝到一段新的内存中,源数据和拷贝之后的数据在内存中相互独立,改变任何一个都不影响另外一个。 浅拷贝:浅拷贝只是将要拷贝数据的地址拷贝到一个新的Mat中,源数据和拷贝后的数据同一段内存中的数据,只要对应内存中的数...

一点儿也不萌的萌萌 2894

手把手教你学AutoSAR - 总目录

鉴于近期较多博友问及微信群,如下可申请好友验证,请备注“autosar”,否则可能添加不通过。验证通过后,拉入讨论群。PS:本人鉴于工作事项可能不能及时回复问题,可在交流群内部和其他博友之间相互沟通交流经验。欢迎来到桃源乐游的《AutoSAR配置与实践》,以下为学习大纲,蓝色字体点击可跳转。

nihaoljq2010的博客 7464

OpenCV = clone()、copyto()的区别及 Mat的浅层拷贝与深层拷贝

1. OpenCV中的clone()和直接赋值(=)都会导致共享数据区,也就是相当于C++的引用(&),使用copy,才会获取新的Mat。及具有相同的type和size的Mat变量,copyTo和直接赋值(=)不会为目标矩阵重新分配内存,而clone总是会为目标矩阵重新分配内存。 Mat image1(image) ;//仅是创建了Mat的头部分,image1与image共享...

紫蝶侠的博客 4009

Android Telephony主要模块及功能

Telephony的代码主要由五个模块组成 1.Telephony Frameworks 代码区域: frameworks/opt/telephony/ 其中主要的文件在如下目录 /frameworks/opt/telephony/src/java/com/android/internal/telephony/ 其中比较常见的有以下几类文件 1.BaseCommands、RIL构成R

泊客 7728

YOLOv8进阶实战:融合SAHI超推理算法,在无人机应用中精准捕捉视频与图片中的微小目标

YOLOv8改进是一种先进的目标检测算法,通过引入辅助超推理算法SAHI推理,使得小目标无法逃避检测。SAHI推理算法结合视频和图片的特点,利用先进的超推理技术,提高了目标检测的准确性和鲁棒性。不仅如此,YOLOv8改进还支持对视频和图片进行实时的目标检测,将检测结果直观地呈现给用户。这一技术的应用范围广泛,可以用于安防领域,提升监控设备的性能和效率;也可以用于无人驾驶领域,实现精准的目标识别和跟踪。总之,YOLOv8改进是一项具有突破性的技术,为目标检测领域带来了重大的进展。

weixin_51988935的博客 808

OpenCV之Mat的详细介绍

在opencv中,Mat作为图像的存储容器,是非常基础也是非常重要的知识,本文主要介绍Mat相关的操作。 1 图像复制 再开始将拷贝之前,先给大家分享一下浅拷贝和深拷贝 浅拷贝:拷贝对象和被拷贝对象都指向同一个内存空间,修改任何一个对象的数据都会影响另外一个; 举个例子:小明和小红在沙漠中共用一个水瓶喝水,任何一个人喝了水,另外一个人都会剩下更少的水。 深拷贝:拷贝对象和被拷贝对象指向不同的内容空间,修改数据时互不影响。 举个例子:小明和小红各有一个水瓶,各自喝各自的水对对方不影响。 深拷贝和浅拷贝都各有优

PRML_MAN的博客 1万+

Centos 7 Linux 离线安装单机 Kafka:下载、安装、配置、使用

本文详细介绍了在 CentOS 7 系统上离线安装单机版 Apache Kafka 的完整流程,包括环境准备(JDK 安装)、Kafka 安装包上传与解压、关键配置修改(如监听地址)、ZooKeeper 与 Kafka 服务的启动,以及 Topic 的创建、消息的生产和消费等基础操作。适用于无网络环境下的 Kafka 快速部署与学习,为后续开发或测试提供本地消息队列支持。

寒水馨 · 轻量级技术文档 · hanshuixin.org 1320

C++ opencv之图像对象的创建与赋值

文章目录一、引入二、克隆与拷贝三、创建图像 一、引入 首先我们来看一下Mat 的基本结构 其中数据部分为像素的值的一个集合,头部就是包含图像的一个属性,比如大小、宽高、类型、通道数等等。 在对他进行赋值操作的时候,只是相当于把内存的指针重新指向了原来的数据,本质上还是同一个DataBlock,当进行克隆或者拷贝操作的时候,就会把这个Mat中所有的数据复制一份,以供使用。 二、克隆与拷贝 还是跟以前一样,采用多文件调用的方式。声明函数的demo放在quickopencv.h文件里,实现放在quickdemo

weixin_46196863的博客 4130

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Opencv3 core模块解析之Mat类(1)

在阅读opencv文档和源码时,常常看到InputArray、OutputArray、UMat、Mat_等“奇怪”的类,与我们常用的Mat,好像一样又不完全一样,这些其实主要在opencv内部用,其中有些文档都很少甚至没有,在opencv外部程序还是Mat主打。另外还有Mat的成员create(),copyTo(),clone(),data,empty()等,到底有哪些使用中的注意事项。本文通过源码解析一下。

yyyu200的专栏 4981

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

mat 释放_[转]OpenCv2 学习笔记(1) Mat创建、复制、释放

OpenCV和VS2013的安装图文教程网上有很多,建议安装好之后,用VS2013建立一个空工程,用属性管理器分别新建一个对应debug和release工程的props配置文件,以后直接根据工程需要添加对应配置文件,而不需要每次新建工程后填写引用目录、库目录、附加依赖项,减少重复工作。(用WLW编辑,段间距有点大!)需要说明的是,本学习笔记不会按照先讲数据结构,再讲如何使用。与OpenCv1.x不...

weixin_34997006的博客 1063

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

openCV中Mat对象的使用

OpenCv提供了Mat类用来存储矩阵类型数据,包括向量、矩阵、图像等数据。Mat类分为分为矩阵头和指向存储数据的矩阵指针两部分。矩阵头包含矩阵的尺寸、存储方法、地址和引用次数。矩阵头是一个常数,绝大数情况下,矩阵头的大小远小于矩阵数据量的大小。

weixin_46269422的博客 387

Opencv -- 003 Mat对象的创建与赋值

1、一个Mat对象(图片)包含头部和数据部分两部分信息。 2、当使用赋值方式时,并不会重新开辟一块空间来存储这张图片的信息。Mat还有一个克隆/拷贝方法,当调用这两个方法时,才会将另外开辟一块空间来存储这张图片的信息。 如何调用拷贝和克隆方法。 void QuickDemo::mat_creation_demo(Mat& image) { Mat m1,m2; //克隆方法 m1 = image.clone(); //拷贝方法 image.copyTo(m2); } 如何创建空白图像..

xuechanba的博客 2506

OpenCV 图像复制和图像区域读写

图像复制 共享数据, 使用 new Mat(srcMat, ...) 和 newMat=srcMat 生成新的Mat都和原Mat共享数据, 也就是说如果修改某一Mat,其他Mat也会随之改变 复制全新的Mat, 使用CopyTo() 和 Clone() 方法将生成一个全新的Mat, 新Mat和原Mat不共享数据. 图像区域和点的读写 区域读取: 通过srcMat[Rect] 读取指定区域...

诸葛建站 360
上一篇: 可变参数函数的使用:va_start() , va_end() , va_list
下一篇: C++格式化输出
知行且执行
博客等级 码龄14年 38粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值