学习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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。