「大腦」生長系列(九)

  • 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中指定的空間中。

這是筆者合併後的效果,你可以選擇自己喜歡的圖片做合併哦。