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