对于Mat之间赋值传递,opencv分为两种情况一种是浅层拷贝比如Mat A=imread("x.jpg"); Mat B=A;时候B就是浅层拷贝A,B只拷贝了A的的头部和地址,当B被操作后A也随之改变;第二种既是深层拷贝,例如Mat A=imread("x.jpg"); Mat B=A.clone();这时候B是开辟了新的内存完全的复制了A的内容,操作B不会对A造成影响;
下面为实例代码:
void matTest2()
{
//1、浅层拷贝对某些算子没有影响
Mat img1=imread("D:/ImageTest/test.jpg");
Mat img2=img1;
cv::imshow("First1", img1);
//对于灰度及canny算子等图像浅层拷贝没有影响
// cvtColor( img2, img2, CV_BGR2GRAY );//Canny边缘检测需要灰度图像
Canny( img2, img2, 30, 100); //Canny 边缘检测
cv::imshow("Second1", img1);
cv::waitKey(0);
//2、浅层拷贝对某些算子有影响比如翻转操作
Mat img3=imread("D:/ImageTest/test.jpg");
Mat img4=img3; //拷贝方式为浅拷贝
imshow("First2",img3);
// cvtColor( img4, img4, CV_BGR2GRAY );//灰度加入灰度后图像变为深层拷贝
flip(img4,img4,1); //注意应在原地进行镜像变换
imshow("Second2",img3);
cv::waitKey(0);
//3、深层拷贝翻转操作也无影响
Mat img5=imread("D:/ImageTest/test.jpg");
Mat img6=img5.clone(); //深层拷贝后无影响
imshow("First3",img5);
flip(img6,img6,1); //注意应在原地进行镜像变换
imshow("Second3",img5);
cv::waitKey(0);
}
第一组的处理结果:
第二组的处理结果:
第三组的处理结果: