c++中,函数参数的传值、传引用、传指针是有区别的。 通常情况下:传值是对原对象的拷贝,在函数内对其进行的操作不会影响到原对象。 而传指针,是将指向原对象内存区域的一个指针作为函数参数,在函数内,访问和操作该指针指向的内存,会直接影响到原对象。引用的定义是原对象的一个绑定,可以理解为两个对象是一致的,修改其中一个,另一个也会改变。
但是opencv中的Mat对象却并非这样。
三张图分别为:原始图片src_1、将src_1 值传递给函数myDrawCircle生成的图、和函数调用结束后的src_1。
可以发现Mat对象传值调用,函数内对其的操作将会影响原对象!
2.传引用
分别为调用函数前后的图片。
引用是对原对象的绑定,对引用进行操作,会改变原对象!
3.重载符=
使用opencv中的重载符=,如Mat img=src;
如上,使用=复制的图片,对其进行操作,会改变原图;
4.拷贝构造函数
Mat img(src);
同=,对其进行操作,会改变原图;
Mat img;src.copyTo(img);
src_3为原图,myDrawcircle4是在copyTo复制的图上画的圆,cur Src_3是在上述操作后的src_3。
可以看出,copyTo函数复制的对象,对其进行操作,不会影响原对象
打开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;
}
目录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]音频隐写解题思路:1.题目提示音频隐写,用Audacity打开附件,导入原始数据,选择频谱图flag{f8fbb2c761821d3af23858f721cc140b}
select row_number() over (order by [ID]) as RowID,[ID] from Table1order by [ID]
Google 近日发布了 TensorFlow 1.0 候选版,这第一个稳定版将是深度学习框架发展中的里程碑的一步。自 TensorFlow 于 2015 年底正式开源,距今已有一年多,这期间 TensorFlow 不断给人以惊喜。在这一年多时间,TensorFlow 已从初入深度学习框架大战的新星,成为了几近垄断的行业事实标准。主流深度学习框架对比深度学习研究的热潮持续高涨,各种
文章目录前言实例通过jdk工具jps、jstack排查死锁问题步骤一:使用jsp查找程序进行通过jdk提供的工具jconsole排查死锁问题通过jdk提供的工具VisualVM排查死锁问题如何避免死锁?1. 正确的顺序获得锁2. 超时放弃总结前言相信程序员都会碰上这样的问题,Java死锁如何排查?又如何解决呢?那么,何为死锁呢?死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此...
; not allowed before ELSEElSE前不允许有“;”<clause> clause not allowed in OLE automation section在OLE自动区段不允许“<clause>”子句<name> is not a type identifier<nam...
启动内核有8个分区,而我们的uboot只有4个分区。0x00000000-0x00040000 : "bootloader" //存放uboot0x00040000-0x00060000 : "params" //存放环境变量0x00060000-0x00260000 : "kernel" //存放内核0...
Ncverilog使用。2010-05-27 16:31(转);本人不用c的软件。在NC自带的帮助Cadence NC-Verilog Simulator Help中都可以找到。以下整理自网络,有点乱 :(ncverilog是shell版的,nclaunch是以图形界面为基础的,二者调用相同内核;ncverilog的执行有三步模式和单步模式,在nclaunch中对应...
*****安装 python (本文安装 python2.7)*****安装 pip(1)检查是否已安装pip进入cmd命令窗口,输入 pip --version ,查看是否已安装pip,说明已安装了pip否则,说明未安装pip需要进入(2)开始安装pip。 (2)安装pip pip用来安装后续的包,安装pip前需确认已安装Python和ea
本设计是基于单片机的教室人数检测系统,主要实现以下功能:可实现LCD1602显示应到人数以及实到人数; 可实现通过按键调节应到人数的数值大小; 可实现通过按键确认是否上课,检测人数是否已经够了; 可实现通过一对红外对管检测人是进来和出去; 实现通过两对红外对管同时检测前门和后门人数进出。标签:51单片机、LCD1602、红外对管、人数统计题目扩展:自习室人数统计、教室人数统计、会议室人数统计资料预览效果图:总体资料:原理图:软件设计流程:
git init:首先看一下使用的效果:用法及解释:1.进入某个空的文件夹下,打开Git Bash命令窗口输入git init2.主要用来初始化一个空的git本地仓库3.执行完上面的命令,当前目录下会自动生成.git隐藏文件夹,该隐藏文件夹就是git版本库git add:使用效果:用法及解释:1.文件1.txt从工作区被提交到暂存区2.但此时文件并没有真正进入到版本库当中,...
最近在大哥那边接到一个任务,用cocos2dx开发一款消灭星星。开始的时候想上网找个demo,但找到的是cocos2d-js版的。唯一找到一个也是基于cocos2dx2.2开发出来的,与现在的3.2版本已经差很远了,很多3.0以后的特性都没有用到。所以只好参考前面两位前辈的开发思路,自己搞一个基于3.2的popstar.下面附上他们的网址。http://blog.csdn.net/touchs