opencv中,clone(),=,以及copyTo()函数的异同

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

  • 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()都是深拷贝; 而“=”操作,当原图改变时,目标图像也会发生改变,原因是赋值操作令两张图片有两个“头”,但是共用一段内存空间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值