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
。