2019年9月22日 星期日

OpenCV clone、copyTo(影像複製)

在影像處理中,往往需要將特定的影像進行複製,在這邊介紹一下我在OpenCV常用的影像複製,主要有兩種方式,第一種為clone、第二種為copyTo,因為運算子 = 有時會被混淆,所以我會一起做說明。



運算子=


利用運算子=的方式,使得DogImg 與DogCloneImg 都會指到同一個記憶體空間,所以在使用
完threshold,兩張影像都會一起被處理,其概念就像是c++中,指標指到一樣地方,故會一起被修改。


////-------------------分隔線
#include <cstdio>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(){

Mat DogImg = imread("dog1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat DogCloneImg;

DogCloneImg = DogImg;
threshold(DogImg, DogImg, 150, 255, CV_THRESH_BINARY);

imshow("DogImg", DogImg);
imshow("DogCloneImg", DogCloneImg);

waitKey(0);
return 0;

}
/////////-------------

結果圖:





複製方法一(clone)


因為是使用clone,所以DogImg 的記憶體位置被改變了,且複製了CatImg的影像數據
,並因為記憶體位置被改變,所以DogCloneImg 影像數據沒有被改變。


////-------------------分隔線
#include <cstdio>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(){
Mat DogImg = imread("dog1.jpg", CV_LOAD_IMAGE_COLOR);
Mat CatImg = imread("cat1.jpg", CV_LOAD_IMAGE_COLOR);
Mat DogCloneImg;

resize(DogImg, DogImg, Size(CatImg.cols, CatImg.rows));

DogCloneImg = DogImg;
DogImg = CatImg.clone();

imshow("DogImg", DogImg);
imshow("CatImg", CatImg);
imshow("DogCloneImg", DogCloneImg);

waitKey(0);
return 0;
}
/////////-------------

結果圖:

複製方法二(copyTo與原尺寸相同情況下 )

因為是使用copyto且DogImg與CatImg尺寸相同 ,所以不會改變DogImg 的記憶體位置,並
因為DogImg 與DogCloneImg 記憶體位置相同,所以在將CatImg的影像數據複製給DogImg 時
DogCloneImg也一起被改變。

////-------------------分隔線
#include <cstdio>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(){

Mat DogImg = imread("dog1.jpg", CV_LOAD_IMAGE_COLOR);
Mat CatImg = imread("cat1.jpg", CV_LOAD_IMAGE_COLOR);
Mat DogCloneImg;

resize(DogImg, DogImg, Size(CatImg.cols, CatImg.rows));

DogCloneImg = DogImg;
CatImg.copyTo(DogImg);

imshow("DogImg", DogImg);
imshow("CatImg", CatImg);
imshow("DogCloneImg", DogCloneImg);

waitKey(0);
return 0;

}

/////////-------------
結果圖:

複製方法二(copyTo與原尺寸不相同情況下 )

因為是使用copyto且拿掉resize,所以DogImg與CatImg尺寸不相同 ,因此雖然一樣是使用copyto,但會先建立新的記憶體位置,所以結果會與clone複製一樣,而DogCloneImg尺寸會保持原大小。

////-------------------分隔線
#include <cstdio>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main(){

Mat DogImg = imread("dog1.jpg", CV_LOAD_IMAGE_COLOR);
Mat CatImg = imread("cat1.jpg", CV_LOAD_IMAGE_COLOR);
Mat DogCloneImg;

//resize(DogImg, DogImg, Size(CatImg.cols, CatImg.rows));

DogCloneImg = DogImg;
CatImg.copyTo(DogImg);

imshow("DogImg", DogImg);
imshow("CatImg", CatImg);
imshow("DogCloneImg", DogCloneImg);

waitKey(0);
return 0;

}

/////////-------------
結果圖:

沒有留言:

張貼留言