C++ opencv几个拷贝函数

“=”

图像的赋值操作,是浅拷贝,当源图像改变时,也随之改变。

clone()函数,跟进opencv源码,clone()调用了copyTo()函数。inline Mat Mat::clone() const

{ Mat m; copyTo(m); return m; }

copyTo()函数有两个接口,第一个接口就是上述clone()调用的接口,所以copyTo()是clone()的扩展。copyTo()的第二个函数是只拷贝图像的ROI(感兴趣区域)。

void copyTo( OutputArray m ) const; void copyTo( OutputArray m, InputArray mask ) const; 实验,基于opencv2.4.13
void test02()
{
    cv::Mat src = cv::imread("structor.jpg", 1);

    cv::Mat dst_copy;
    src.copyTo(dst_copy);
    //cv::imshow("Dst_copy", dst_copy);

    cv::Mat dst_clone;
    dst_clone = src.clone();
    //cv::imshow("Clone_copy", dst_clone);

    cv::Mat dst_equal;
    dst_equal = src;
    //cv::imshow("Equal_copy", dst_equal);

    src = cv::Scalar::all(0);
    cv::imshow("Dst_copy", dst_copy);
    cv::imshow("Clone_copy", dst_clone);
    cv::imshow("Equal_copy", dst_equal);

    cv::waitKey(0);
}

实验结果

由此可以看到,clone()和copyTo()都是深拷贝; 而“=”操作,当原图改变时,目标图像也会发生改变,原因是赋值操作令两张图片有两个“头”,但是共用一段内存空间。

经验分享 程序员 微信小程序 职场和发展