opencv矩阵赋值函数copyTo、clone、重载元算赋=的比较

opencv矩阵赋值函数copyTo、clone、重载元算赋‘=’之间实现的功能相似均是给不同的矩阵赋值功能。copyTo和clone函数基本相同,被赋值的矩阵和赋值矩阵之间空间独立,不共享同一空间。但是重载元算赋‘=’,被赋值的矩阵和赋值矩阵之间空间共享,改变任一个矩阵的值,会同时影响到另一个矩阵。当矩阵作为函数的返回值时其功能和重载元算赋‘=’相同,赋值运算赋会给矩阵空间增加一次计数,所以函数变量返回后函数内部申请的变量空间并不会被撤销,在主函数中仍可以正常使用传递后的参数。具体的过程见下面的测试程序。

主函数:

Mat m1(5,5,CV_32F);
m1.setTo(1.0);
printf("m1 initialized val:");
printMat(m1);
Mat m2;
m2=m1.clone();//clone赋值方式
m2.setTo(2.0);
printf("m1 val after using 'setTo'function:");
printMat(m1);//改变m2的值看是否影响m1的值。

m1.copyTo(m2);//copyTo赋值方式
m2.setTo(2.0);
printf("m1 val after using 'copyTo'function:");
printMat(m1);
m2=m1;  //‘=’赋值方式
m2.setTo(2.0);
printf("m1 val after using '='function:");
printMat(m1);

Mat m3=test();//函数返回赋值方式
printf("m3 val:");
printMat(m3);

赋初值的函数

cv::Mat test()
{
	cv::Mat filter_t(10,10,CV_32F);
	filter_t.setTo(1.0);
	return filter_t;

}

下面是运行结果图

下面是赋值函数test,赋值前后变量内存情况,红色框是Mat矩阵中空间指针值,比较得出赋值函数返回变量前后是共享同一空间。虽然空间是在test函数中申请得到,但是由于返回赋值会增加一次该空间的引用,所以同一块内存空间在主函数中依然可以使用,只不过跳出test函数后该内存空间引用值较少一个再次变为1。

时间: 2024-08-05 07:58:23

opencv矩阵赋值函数copyTo、clone、重载元算赋=的比较的相关文章

赋值函数(运算符重载)(2)

&1.参数使用引用是为了增加效率,因为如果不是引用,参数为对象则会调用拷贝构造函数2.函数具有返回值是为了,若有连等赋值,保证其正常赋值3.判断语句是为了保证不会出现自己给自己赋值的情况4.返回值为引用是为了提升效率赋值函数表面看起来只是对象赋值给对象,实际上是=号前的对象调用operator=方法,赋值函数的参数即为=号后的对象 void main() { ST t(10,20); ST t1; t1 = t; //这里原理应该是 t1.operator=(&t) } //Test1.h

为什么类的拷贝构造参数加引用、重载赋值函数的返回值和参数加引用

class string { public: string(const char *str=NULL); string(const string& str);     //copy构造函数的参数为什么是引用呢? string& operator=(const string & str); //赋值函数为什么返回值是引用呢?参数为什么是引用呢? ~string(); }; 下面我就给大家解释一下: class String1 { public: String1(const char*

C++ class内的=重载,拷贝赋值函数,重载示例。必须是class内

#include <iostream> // overloading "operator = " inside class // = 是一元操作符.不写,编译器会提供 默认 拷贝赋值函数.可以通过显式“=delete”来禁用默认.对于复杂class的默认=可能会造成问题,请特别注意. ////////////////////////////////////////////////////////// class Rectangle { public: Rectangle(i

OpenCV 矩阵—图像的基本

OpenCV  矩阵-图像的基本 我们有很多方式可以从现实生活中得到图片,数码相机,扫描仪,或者我们几乎人手有一部的手机.然而,当生活中的图在数字设备上存储的时候,一幅图片被分成了很多很多的像素点,像素点就像拼图的时候的碎片,一个个碎片来构成一副图.而每个像素点都是由一个0-255的数字值来表示.在openCV中,一个图片被很多像素点表示,这些表示像素点的值构成了一个矩阵. 上面的图中,由表示像素点的值构成了矩阵,在openCV中,Mat(矩阵)是表示图片的基本. Mat由两部分组成,一个是ma

图像边缘检测--OpenCV之cvCanny函数

图像边缘检测--OpenCV之cvCanny函数 分类: C/C++ void cvCanny( const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture_size=3 ); image单通道输入图像.edges单通道存储边缘的输出图像threshold1第一个阈值threshold2第二个阈值aperture_sizeSobel 算子内核大小 (见 cvSobel). 函数 cvCa

OpenCV &mdash;&mdash; 矩阵操作

多通道的矩阵 -- 通道是连续的!! 要将指向该数据类型的指针移动到下一通道,我们只需要将其增加1.如果想访问下一个"像素"或者元素集,则需要一定的偏移量 矩阵的step元素是矩阵中行的长度,单位为字节.   #include "cv.h" #include "highgui.h" #include <IOSTREAM.H> int main(int argc,char** argv) { float vals[]={0.85,-0.

拷贝构造函数和赋值函数

在 C++ 中,赋值和拷贝是不同的, 1)拷贝构造函数是对未初始化的内存进行初始化操作 2)而赋值是对现有的已经初始化的对象进行操作.(这里我对"已经初始化"的理解是已经调用了构造函数,并且构造函数体可以未执行,只要调用到即可),赋值函数应该给所有数据成员都初始化. 3)重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符. 4)可以说,C++中什么时候有临时对象产生,此时刻c++一定要调用拷贝构造函数.(临时对象产生时有一个特例,此时不需要调用拷

赋值函数与拷贝构造的差异

C++ 拷贝构造函数 赋值构造函数 ================================= 一句话,赋值函数的前提是对象已定义:而拷贝构造是执行时才会创建一个对象.拷贝构造需要的是深拷贝. 赋值函数一般模式: type& operator =(const type& par) { // (1) 检查自赋值 if( this == &par ) return *this; // (2) 释放原有的内存资源 //(3)分配新的内存资源,并复制内容 ,2.3顺序没讲究,注意释

拷贝构造函数和赋值函数的一些知识

/*******************拷贝构造函数和赋值运算符重载有以下两个不同之处***************************/ 1.拷贝构造函数生成新的类对象,而赋值运算符不能. 2.由于拷贝构造函数是直接构造一个新的类对象,所以在初始化这个对象之前不用检验源对象是否和新对象相同,而复制操作符需要这个操作,另外赋值运算符中如果原来对象中有内存分配,要先把内存释放掉. 下面是String类的一个实现的部分函数,可以看出二者的区别. 1 class String{ 2 public: