1、=
#include <opencv2/opencv.hpp>
using namespace cv;
#include <iostream>
using namespace std;
int main()
{
Mat img1(300, 300, CV_32FC3, Scalar(1, 0, 0));
Mat img2(200, 200, CV_32FC3, Scalar(0, 1, 0));
Mat roi = img1(Rect(50, 50, 200, 200)); // roi与img1指向同一内存
imshow("img1 before", img1);
imshow("img2 before", img2);
imshow("roi before", roi);
roi = img2; // 修改roi头部,与img1无关,与img2指向同一内存
rectangle(roi, Rect(50, 50, 100, 100), Scalar(0, 0, 1), 2);
imshow("img1 after", img1);
imshow("img2 after", img2);
imshow("roi after", roi);
waitKey();
}



对于=,roi与img1无关,与img2指向同一内存。此时对roi画红框不会改变img1,但会相应地改变img2。
2、clone
#include <opencv2/opencv.hpp>
using namespace cv;
#include <iostream>
using namespace std;
int main()
{
Mat img1(300, 300, CV_32FC3, Scalar(1, 0, 0));
Mat img2(200, 200, CV_32FC3, Scalar(0, 1, 0));
Mat roi = img1(Rect(50, 50, 200, 200)); // roi与img1指向同一内存
imshow("img1 before", img1);
imshow("img2 before", img2);
imshow("roi before", roi);
roi = img2.clone(); // roi重新分配内存并拷贝数据,roi与img1,img2无关
rectangle(roi, Rect(50, 50, 100, 100), Scalar(0, 0, 1), 2);
imshow("img1 after", img1);
imshow("img2 after", img2);
imshow("roi after", roi);
waitKey();
}



对于clone,clone创建一个完整副本(分配内存并拷贝数据),roi与img1,img2无关。此时对roi画红框不会改变img1和img2。
3、copyTo
#include <opencv2/opencv.hpp>
using namespace cv;
#include <iostream>
using namespace std;
int main()
{
Mat img1(300, 300, CV_32FC3, Scalar(1, 0, 0));
Mat img2(200, 200, CV_32FC3, Scalar(0, 1, 0));
Mat roi = img1(Rect(50, 50, 200, 200)); // roi与img1指向同一内存
imshow("img1 before", img1);
imshow("img2 before", img2);
imshow("roi before", roi);
img2.copyTo(roi); // roi的size、type与img2一致,copyTo只拷贝数据,roi与img1指向同一内存,与img2无关
rectangle(roi, Rect(50, 50, 100, 100), Scalar(0, 0, 1), 2);
imshow("img1 after", img1);
imshow("img2 after", img2);
imshow("roi after", roi);
waitKey();
}



对于copyTo,若roi的size或type与img2一致,则只会拷贝数据,roi仍与img1指向同一内存,但与img2无关。此时对roi画红框会相应改变img1,而不会改变img2。
#include <opencv2/opencv.hpp>
using namespace cv;
#include <iostream>
using namespace std;
int main()
{
Mat img1(300, 300, CV_32FC3, Scalar(1, 0, 0));
Mat img2(200, 200, CV_32FC3, Scalar(0, 1, 0));
Mat roi = img1(Rect(50, 50, 250, 250)); // roi与img1指向同一内存,size不一致
imshow("img1 before", img1);
imshow("img2 before", img2);
imshow("roi before", roi);
img2.copyTo(roi); // roi的size与img2不一致,copyTo重新分配内存并拷贝数据,roi与img,img2无关
rectangle(roi, Rect(50, 50, 100, 100), Scalar(0, 0, 1), 2);
imshow("img1 after", img1);
imshow("img2 after", img2);
imshow("roi after", roi);
waitKey();
}



对于copyTo,若roi的size或type与img2不一致,则copyTo与clone等效,copyTo重新分配内存并拷贝数据,roi与img1,img2无关。此时对roi画红框不会改变img1,img2。