「大腦」生長系列(九)
- 2020 年 4 月 10 日
- 筆記
copyTo
今天是關於影像合併相關的講解。首先要區分一下影像合併與影像融合的概念:影像融合說的是兩幅不同的圖片的疊加,而影像合併說的是將兩幅影像經過大小調整實現並排的效果。
想要實現影像的合併,首先要確定基準,即以哪一幅圖片為基準來做合併。
1:通過resize調整圖片大小;2: 以合併後的影像的大小創建Mat空間; 3:分別將合併前的影像的內容copyTo到新生成的Mat空間中。
copyTo方法的說明
void copyTo( OutputArray m ) const;
說明:copyTo是Mat類的一個介面,參數一個Rect區域,實現的功能是將Mat中的數據拷貝到指定的Rect區域。
一起來看看這段程式碼吧,能自己動手寫一遍就更好啦。
#include <opencv2/core.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char *argv[]) { Mat img1 = imread("2.jpg"); Mat img2 = imread("3.jpg"); int height = img1.rows; int width1 = img1.cols; int width2 = img2.cols; /* 將高影像等比縮放與低影像一致*/ if (img1.rows > img2.rows) { height = img2.rows; width1 = img1.cols * ((float)img2.rows / img1.rows); resize(img1, img1, Size(width1, height)); } else if(img1.rows < img2.rows) { width2 = img2.cols * ((float)img1.rows / img2.rows); resize(img2, img2, Size(width2, height)); } // 創建目標影像 Mat des; des.create(height, width1 + width2, img1.type()); Mat r1 = des(Rect(0,0, width1, height)); img1.copyTo(r1); Mat r2 = des(Rect(width1, 0, width2, height)); img2.copyTo(r2); namedWindow("des"); imshow("des", des); waitKey(0); return 0; }
對這段程式碼的說明
(1)使用的策略是,按照兩幅影像中高度較低的影像進行等比調整;
(2)使用create創建目標空間,寬為width1 + width2,高為較小影像的height;
(3)將源影像1和源影像2拷貝到目標Mat中指定的空間中。
這是筆者合併後的效果,你可以選擇自己喜歡的圖片做合併哦。


