学习OpenCV3:=、clone、copyTo的区别


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();
}

  对于=roiimg1无关,与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();
}

  对于cloneclone创建一个完整副本(分配内存并拷贝数据),roiimg1img2无关。此时对roi画红框不会改变img1img2

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,若roisizetypeimg2一致,则只会拷贝数据,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,若roisizetypeimg2不一致,则copyToclone等效,copyTo重新分配内存并拷贝数据,roiimg1img2无关。此时对roi画红框不会改变img1img2

猜你喜欢

转载自blog.csdn.net/qq_34801642/article/details/107309518