天天看點

c++ opencv mat_OpenCV實作多張圖像拼接

點選上方“3D視覺工坊”,選擇“星标”

幹貨第一時間送達

圖像拼接Stitch子產品算法流程與代碼使用介紹

拼接算法

OpenCV從2.4.x版本之後多出來一個新的模型 圖像拼接,該子產品通過簡單的進階API設定,可以獲得比較好的圖像拼接效果,OpenCV官方提供了一個高度內建的API函數 Stitcher,隻要兩行代碼就可以得到一個很好的拼接圖像。

Ptr stitcher = Stitcher::create(mode);
Stitcher::Status status = stitcher->stitch(imgs, pano);
           

其中第一行代碼是建立拼接Stitcher的指針,第二行代碼是調用拼接算法,

  • imgs表示的輸入參數,是一系列Mat對象的vector。
  • pano表示的輸出結果,是拼接之後的Mat對象

官方的例子得到效果是非常的好,輸入的images如下:

c++ opencv mat_OpenCV實作多張圖像拼接

拼接結果如下:

c++ opencv mat_OpenCV實作多張圖像拼接

但是很多人按照官方的例子開始拼接自己的圖像,就是各種掉坑,各種拼接都不出結果,想跟跟上面一樣簡單的調用兩句代碼完成幾乎是個夢,其實這個API裡面有很多參數設定,這個在官方的示範當中都沒有詳細交代,stitching拼接算法 流程圖示如下:

c++ opencv mat_OpenCV實作多張圖像拼接

可見圖像拼接是一個很複雜的算法,是由一系列的基礎算法構成,這些基礎算法如果你不是很了解,其實很難實作自己的圖像拼接,這其中影響拼接算法stitch工作最常見幾個算法子子產品為:

  • 特征發現與描述子

    常見的特征可以選擇SIFT、SURF、AKAZE、ORB等特征算子進行比對

  • 相機參數

    不同的相機參數與設定會導緻不同的結果

  • 融合方式(blender)

    不同的融合方式,也會導緻不同結果

  • 各種門檻值設定,特别是config threshold,如果無法特征比對,記得把這個門檻值調小點

其它參數可以如何設定可以參考OpenCV的官方文檔,總之無法拼接就去調參數,一般最後都會拼接成功,此外該算法速度比較慢,但是支援GPU執行,是以想要實時的可以嘗試如何GPU下執行,我這裡沒有嘗試 ,誰嘗試過的可以留言分享,我負責置頂。

代碼示範

另外在拼接的時候可以設定不同warper,這樣會對拼接之後的圖像生成不同效果,常見的效果包括

  • 魚眼相機
  • 環視(平面曲翹)
  • 預設

圖示分别如下:

c++ opencv mat_OpenCV實作多張圖像拼接
c++ opencv mat_OpenCV實作多張圖像拼接
c++ opencv mat_OpenCV實作多張圖像拼接

示範代碼如下:

#include 
#include 

using namespace cv;
using namespace std;

int main(int argc, char** argv) {
    vector<string> files;
    glob("D:/images/zsxq/1", files);
    vector images;for (int i = 0; i         printf("image file : %s \n", files[i].c_str());
        images.push_back(imread(files[i]));
    }// 設定拼接模式與參數
    Mat result1, result2, result3;
    Stitcher::Mode mode = Stitcher::PANORAMA;
    Ptr stitcher = Stitcher::create(mode);// 拼接方式-多通道融合auto blender = detail::Blender::createDefault(detail::Blender::MULTI_BAND);
    stitcher->setBlender(blender);// 拼接
    Stitcher::Status status = stitcher->stitch(images, result1);// 平面曲翹拼接auto plane_warper = makePtr<:planewarper>();
    stitcher->setWarper(plane_warper);
    status = stitcher->stitch(images, result2);// 魚眼拼接auto fisheye_warper = makePtr<:fisheyewarper>();
    stitcher->setWarper(fisheye_warper);
    status = stitcher->stitch(images, result3);// 檢查傳回if (status != Stitcher::OK)
    {cout <"Can't stitch images, error code = " <int(status) <endl;return EXIT_FAILURE;
    }
    imwrite("D:/result1.png", result1);
    imwrite("D:/result2.png", result2);
    imwrite("D:/result3.png", result3);
    waitKey(0);return 0;
}
           

注意:一起運作速度比較慢!是真的比較慢!

薦讀

聊聊三維重建-條紋法之相位法(一)

那些精貴的3D視覺系統學習資源(附視訊)

吐血整理|3D視覺系統化學習路線

交流群 歡迎加入我們公衆号讀者群一起和同行交流,目前有3D視覺、CV&深度學習、SLAM、三維重建、點雲後處理、自動駕駛等微信群,請掃描下面微信号加群,備注:”研究方向+學校/公司+昵稱“,例如:”3D視覺 + 上海交大 + 靜靜“。請按照格式備注,否則不予通過。添加成功後會根據研究方向邀請進去相關微信群。

c++ opencv mat_OpenCV實作多張圖像拼接

▲長按加群

c++ opencv mat_OpenCV實作多張圖像拼接

▲長按關注我們

繼續閱讀