OpenCV copyTo、clone、“=”与拷贝构造函数的区别

OpenCV copyTo、clone、“=”与拷贝构造函数的区别opencv 中为矩阵复制提供了 copyTo 函数 clone 函数 重载运算符和拷贝构造函数 用法非常简单 Matsrcimage imread 1 jpg Matfirstimag secondimage thirdimage srcimage copyTo firstimage secondimage srcimage clon

opencv中为矩阵复制提供了copyTo函数、clone函数、重载运算符和拷贝构造函数,用法非常简单:

 Mat srcimage = imread("1.jpg"); Mat firstimage,secondimage,thirdimage; srcimage.copyTo(firstimage); secondimage = srcimage.clone(); thirdimage = srcimage; Mat fourthimage(srcimage); 

但是在他们四者间存在着较大的区别,我们先写个简单的代码测试一下:

 Mat srcimage = imread("2.jpg"); Mat firstimage,secondimage,thirdimage; double t1 = (double)getTickCount(); srcimage.copyTo(firstimage); t1 = (double)getTickCount() - t1; double t2 = (double)getTickCount(); secondimage = srcimage.clone(); t2 = (double)getTickCount() - t2; double t3 = (double)getTickCount(); thirdimage = srcimage; t3 = (double)getTickCount() - t3; double t4 = (double)getTickCount(); Mat fourthimage(srcimage); t4 = (double)getTickCount() - t4; printf("copyTo execution time = %lfms\n", t1*1000. / getTickFrequency()); printf("clone execution time = %lfms\n", t2*1000. / getTickFrequency()); printf(" = execution time = %lfms\n", t3*1000. / getTickFrequency()); printf(" 构造函数 execution time = %lfms\n", t4*1000. / getTickFrequency()); getchar(); 

为了让效果明显,选择了一张很大的图片,这样图片的尺寸是3120*4160,实验结果如下:

这里写图片描述

我们可以看到,copyTo函数、clone函数占用时间差不多,但是“= ”运算符与拷贝构造函数用的时间却非常少,这是为什么呢?

造成这样的情况的原因是因为Mat的数据类型以及它的数据组成造成的。

Mat类

从上面的话我们可以看到,copyTo函数、clone函数拷贝的不仅仅是信息头,还有矩阵本身,而“= ”运算符与拷贝构造函数仅仅拷贝了信息头,他们指向的其实是一个矩阵,也就是在上的程序中,我们改变srcimage ,thirdimage和fourthimage中的任何一个,另外两个也会跟着变化,我们再改一下代码测试一下(为了屏幕能放下,我们把图片换一下):

 Mat srcimage = imread("1.jpg"); Mat firstimage,secondimage,thirdimage; imshow("result1",srcimage); double t1 = (double)getTickCount(); srcimage.copyTo(firstimage); Point center = Point(55,55); int r = 10; circle(firstimage,center,r,Scalar(0,0,255),-1); t1 = (double)getTickCount() - t1; imshow("result2",firstimage); double t2 = (double)getTickCount(); secondimage = srcimage.clone(); t2 = (double)getTickCount() - t2; double t3 = (double)getTickCount(); thirdimage = srcimage; t3 = (double)getTickCount() - t3; double t4 = (double)getTickCount(); Mat fourthimage(srcimage); t4 = (double)getTickCount() - t4; Point a = Point (0,0); Point b = Point (thirdimage.cols,thirdimage.rows); line(thirdimage,a,b,Scalar(255,0,0)); printf("copyTo execution time = %lfms\n", t1*1000. / getTickFrequency()); printf("clone execution time = %lfms\n", t2*1000. / getTickFrequency()); printf(" = execution time = %lfms\n", t3*1000. / getTickFrequency()); printf(" 构造函数 execution time = %lfms\n", t4*1000. / getTickFrequency()); imshow("result3",srcimage); waitKey(0); getchar(); 

可以看到,在原图刚刚读入的时候,显示了窗口result1,此时显示的就是读入的图片,firstimage是由srcimage通过copyTo的方法拷贝的,我们把firstimage画一个圆,然后用result2窗口显示,thirdimage是由srcimage通过“=”运算符拷贝的,我们将thirdimage画个线,并用result3再一次显示srcimage,然后我们可以看到,result3中srcimage已经变了,变成了和thirdimage一样的效果,说明之前的说法是正确的,他们共有了同一个矩阵。

这里写图片描述

这里写图片描述

这里写图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/229990.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午3:23
下一篇 2026年3月16日 下午3:23


相关推荐

  • 腾讯混元T1正式版:深度思考模型引领智能AI新时代

    腾讯混元T1正式版:深度思考模型引领智能AI新时代

    2026年3月12日
    1
  • VUE分页出现省略号「建议收藏」

    VUE分页出现省略号「建议收藏」提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档VUE分页出现省略号废话不多说直接上代码calcPageNum(){letpageTotal=Math.ceil(this.total/this.limit);//获取最大页码数letcur=this.currentPage;//获取当前页码数if(pageTotal<7){//判断什么时候正常显示

    2026年4月20日
    4
  • Javadoc 使用详解

    Javadoc 使用详解一:简介Javadoc用于描述类或者方法的作用。Javadoc可以写在类上面和方法上面。https://docs.oracle.com/javase/7/docs/technotes/tools/windows/javadoc.html二:写在类上面的Javadoc写在类上的文档标注一般分为三段:第一段:概要描述,通常用一句或者一段话简要描述该类的作用,以英文句号作为结束第…

    2025年12月8日
    5
  • Promise 执行机制–原理–规范[通俗易懂]

    Promise 执行机制–原理–规范[通俗易懂]Promise 执行机制–原理–规范

    2022年4月22日
    95
  • 微信群发提示频繁怎么办?

    微信群发提示频繁怎么办?微信群发提示频繁怎么吧 频繁是因为微信故意这样设置的 压根就不想你群发

    2026年3月17日
    2
  • c#数组赋初值_C#数组初始化

    c#数组赋初值_C#数组初始化C#的数组初始化是在声明数组时将初始值放在大括号({})之内。如果没有指定初始值,则数组成员将自动初始化为该数组类型的默认初始值。请阅读数组的属性。如果将数组声明为某类型的字段,则当实例化该类型时它将被设置为默认值null。一、一维数组的初始化1.在声明数组时将其初始化。如:int[]array=newint[6]{1,2,3,4,5,6};string[]stringArray=…

    2022年7月18日
    70

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号