opencv中Mat的传值、传引用、拷贝_Lee_Dk的博客-程序员信息网

技术标签: Mat的复制  opencv  Mat传值调用  

一.前言

    c++中,函数参数的传值、传引用、传指针是有区别的。 通常情况下:传值是对原对象的拷贝,在函数内对其进行的操作不会影响到原对象。 而传指针,是将指向原对象内存区域的一个指针作为函数参数,在函数内,访问和操作该指针指向的内存,会直接影响到原对象。引用的定义是原对象的一个绑定,可以理解为两个对象是一致的,修改其中一个,另一个也会改变。

    但是opencv中的Mat对象却并非这样。

二.实验

    1.传值

                    

                    

                    

        三张图分别为:原始图片src_1、将src_1 值传递给函数myDrawCircle生成的图、和函数调用结束后的src_1。

        可以发现Mat对象传值调用,函数内对其的操作将会影响原对象!

 

    2.传引用

        

        分别为调用函数前后的图片。

        引用是对原对象的绑定,对引用进行操作,会改变原对象!

    3.重载符=

    

        使用opencv中的重载符=,如Mat img=src;

        如上,使用=复制的图片,对其进行操作,会改变原图;

    4.拷贝构造函数

         Mat img(src);

         同=,对其进行操作,会改变原图;

    5.copyTo()函数

            Mat img;src.copyTo(img);

            

    src_3为原图,myDrawcircle4是在copyTo复制的图上画的圆,cur Src_3是在上述操作后的src_3。

    可以看出,copyTo函数复制的对象,对其进行操作,不会影响原对象

    6.clone()

 

        打开mat.hpp,clone的定义是这样的。显然,clone()同copyTo

三.总结

    Mat src=imread("./1.jpg");

    使用赋值运算符和拷贝构造函数只复制信息头,对其进行操作会作用在原对象上

    Mat A=src;

    Mat B(src);

    使用函数clone()或者copyTo可复制一副图像的矩阵,对其进行操作不会影响原对象

    Mat C,D;

    C=src.clone();

    src.copyTo(D);

   Mat对象做为函数参数,不仅是传引用,传指针,对于传值调用,在函数内对其进行的操作会作用到原对象

四.以上实验的代码

#include <opencv2/opencv.hpp>
#include <iostream>

void myDrawCirle(cv::Mat img)   //传值 
{
	cv::circle(img,cv::Point2i(img.cols/2,img.rows/2),30,cv::Scalar(0,0,255),-1,8);
	cv::imshow("myDrawCircle",img);
	cv::waitKey(3);
}

void myDrawCirle2(cv::Mat &img) //传引用
{
	cv::circle(img,cv::Point2i(img.cols/2,img.rows/2),30,cv::Scalar(0,0,255),-1,8);
	cv::imshow("myDrawCircle2",img);
	cv::waitKey(3);
}
void myDrawCirle3(cv::Mat img)  //clone()
{
	cv::Mat dst=img.clone();
	cv::circle(dst,cv::Point2i(img.cols/2,img.rows/2),30,cv::Scalar(0,0,255),-1,8);
	cv::imshow("myDrawCircle3",dst);
	cv::waitKey(3);
}
void myDrawCirle4(cv::Mat img)  //copyTo
{
	cv::Mat dst;
	img.copyTo(dst);
	cv::circle(dst,cv::Point2i(img.cols/2,img.rows/2),30,cv::Scalar(0,0,255),-1,8);
	cv::imshow("myDrawCircle4",dst);
	cv::waitKey(0);
}
void myDrawCirle5(cv::Mat img)  //赋值运算符
{
	cv::Mat dst=img;
	cv::circle(dst,cv::Point2i(img.cols/2,img.rows/2),30,cv::Scalar(0,0,255),-1,8);
	cv::imshow("myDrawCircle5",dst);
	cv::waitKey(3);
}
void myDrawCirle6(cv::Mat img)   //(拷贝)构造函数
{
	cv::Mat dst(img);
	cv::circle(dst,cv::Point2i(img.cols/2,img.rows/2),30,cv::Scalar(0,0,255),-1,8);
	cv::imshow("myDrawCircle6",dst);
	cv::waitKey(3);
}
int main()
{
	cv::Mat src_1=cv::imread("./小王子1.jpg");
	cv::Mat src_2=cv::imread("./小王子2.jpg");
	cv::Mat src_3=cv::imread("./小王子3.jpg");

	cv::imshow("src_1",src_1);
	cv::imshow("src_2",src_2);
	cv::imshow("src_3",src_3);
	
	myDrawCirle(src_1);         
	cv::imshow("curSrc_1",src_1);

	myDrawCirle2(src_2);
	cv::imshow("curSrc_2",src_2);

	myDrawCirle3(src_3);
	/*myDrawCirle4(src_3);
	myDrawCirle5(src_3);
	myDrawCirle6(src_3);*/
	cv::imshow("curSrc_3",src_3);

	cvWaitKey(0);
	return 0;
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Lee_Dk/article/details/80506559

智能推荐

Python数据分析与挖掘实战-基础篇总结(一)_plt.plot 颜色b--_卞亚超的博客-程序员信息网

目录1、数据挖掘基础1.1 数据挖掘的基本任务:1.2数据挖掘建模过程:1.3常用的数据挖掘建模工具2、python数据分析简介2.1 python环境搭建2.2 python数据分析第三方库2.2.1 Numpy基本操作2.2.2 Pandas简单例子3、数据探索3.1 数据质量分析3.1.1 缺失值分析3.1.2 异常值分析3.1.3 一致性分析3.2 数据特征分析3.2.1 分布分析3.2.2 对比分析3.2.3 统计量分析.

2021年“绿城杯”网络安全大赛-Misc-[warmup]音频隐写_音频隐写解题思路_夜白君的博客-程序员信息网

2021年“绿城杯”网络安全大赛-Misc-[warmup]音频隐写解题思路:1.题目提示音频隐写,用Audacity打开附件,导入原始数据,选择频谱图flag{f8fbb2c761821d3af23858f721cc140b}

SQL SERVER:查询显示结果中带有行号_小鸿叔的博客-程序员信息网

select row_number() over (order by [ID]) as RowID,[ID] from Table1order by [ID] 

TensorFlow和Caffe、MXNet、Keras等深度学习框架的对比_shelleyHLX的博客-程序员信息网

Google 近日发布了 TensorFlow 1.0 候选版,这第一个稳定版将是深度学习框架发展中的里程碑的一步。自 TensorFlow 于 2015 年底正式开源,距今已有一年多,这期间 TensorFlow 不断给人以惊喜。在这一年多时间,TensorFlow 已从初入深度学习框架大战的新星,成为了几近垄断的行业事实标准。主流深度学习框架对比深度学习研究的热潮持续高涨,各种

教你如何快速排查死锁,如何避免死锁!_排查应用处理过程中线程对锁资源的使用(调用、释放),防止出现多锁情况下的死锁场__Ricky_的博客-程序员信息网

文章目录前言实例通过jdk工具jps、jstack排查死锁问题步骤一:使用jsp查找程序进行通过jdk提供的工具jconsole排查死锁问题通过jdk提供的工具VisualVM排查死锁问题如何避免死锁?1. 正确的顺序获得锁2. 超时放弃总结前言相信程序员都会碰上这样的问题,Java死锁如何排查?又如何解决呢?那么,何为死锁呢?死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此...

Delphi 编译错误信息表《转》_ahcxz24202的博客-程序员信息网

; not allowed before ELSEElSE前不允许有“;”&lt;clause&gt; clause not allowed in OLE automation section在OLE自动区段不允许“&lt;clause&gt;”子句&lt;name&gt; is not a type identifier&lt;nam...

随便推点

S3C2440移植linux3.4.2内核之修改分区以及制作根文件系统_busybox构建s3c2440根文件系统_嵌入式与Linux那些事的博客-程序员信息网

启动内核有8个分区,而我们的uboot只有4个分区。0x00000000-0x00040000 : "bootloader" //存放uboot0x00040000-0x00060000 : "params" //存放环境变量0x00060000-0x00260000 : "kernel" //存放内核0...

转与百度的NC——verilog的使用_weixin_30919571的博客-程序员信息网

Ncverilog使用。2010-05-27 16:31(转);本人不用c的软件。在NC自带的帮助Cadence NC-Verilog Simulator Help中都可以找到。以下整理自网络,有点乱 :(ncverilog是shell版的,nclaunch是以图形界面为基础的,二者调用相同内核;ncverilog的执行有三步模式和单步模式,在nclaunch中对应...

python中Numpy包的安装及使用_hua_juan的博客-程序员信息网

*****安装 python (本文安装 python2.7)*****安装 pip(1)检查是否已安装pip进入cmd命令窗口,输入  pip --version  ,查看是否已安装pip,说明已安装了pip否则,说明未安装pip需要进入(2)开始安装pip。 (2)安装pip pip用来安装后续的包,安装pip前需确认已安装Python和ea

基于单片机的教室人数检测系统_基于8051的教室人数统计系统_wfch0的博客-程序员信息网

本设计是基于单片机的教室人数检测系统,主要实现以下功能:可实现LCD1602显示应到人数以及实到人数; 可实现通过按键调节应到人数的数值大小; 可实现通过按键确认是否上课,检测人数是否已经够了; 可实现通过一对红外对管检测人是进来和出去; 实现通过两对红外对管同时检测前门和后门人数进出。标签:51单片机、LCD1602、红外对管、人数统计题目扩展:自习室人数统计、教室人数统计、会议室人数统计资料预览效果图:总体资料:原理图:软件设计流程:

git简单入门之git init /git add /git commit -v_70kggg的博客-程序员信息网

git init:首先看一下使用的效果:用法及解释:1.进入某个空的文件夹下,打开Git Bash命令窗口输入git init2.主要用来初始化一个空的git本地仓库3.执行完上面的命令,当前目录下会自动生成.git隐藏文件夹,该隐藏文件夹就是git版本库git add:使用效果:用法及解释:1.文件1.txt从工作区被提交到暂存区2.但此时文件并没有真正进入到版本库当中,...

利用cocos2dx 3.2开发消灭星星(一)基本介绍_cocos2dx消灭星星_hezijian22的博客-程序员信息网

最近在大哥那边接到一个任务,用cocos2dx开发一款消灭星星。开始的时候想上网找个demo,但找到的是cocos2d-js版的。唯一找到一个也是基于cocos2dx2.2开发出来的,与现在的3.2版本已经差很远了,很多3.0以后的特性都没有用到。所以只好参考前面两位前辈的开发思路,自己搞一个基于3.2的popstar.下面附上他们的网址。http://blog.csdn.net/touchs

推荐文章

热门文章

相关标签