使用Stitcher類,通過createDefault()方法創建拼接對象,通過stitch()方法執行默認的自動拼接。自動拼接和07年Brown和Lowe發表的論文描述的步驟基本一致,只不過使用的特征提取算法是ORB,而不是慢吞吞、有專利保護的SIFT和SURF。開源萬歲!
代碼內容:設置幾張圖片,扔到向量里面,然后計算全景圖。
opencv-3.0.0源碼中沒有找到測試圖片,很蛋碎。到github上找了下,發現都在[https://github.com/Itseez/opencv_extra](opencv_extra)這個項目下。。使用到了boat1.jpg~boat6.jpg
在fedora22+i53210+12G內存+全SSD條件下測試,還是有點慢的,大概5,6秒才出結果。當然,如果只有2張圖片,秒出。
代碼:
//圖像拼接 //哦,這個程序是最簡單的拼接,最傻瓜的那種,不必知道拼接的pipeline //只需要調用createDefault()和stitch()方法就可以完成拼接 #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/stitching/stitcher.hpp> using namespace std; using namespace cv; string IMAGE_PATH_PREFIX = "/home/chris/Pictures/"; bool try_use_gpu = false; vector<Mat> imgs; string result_name = IMAGE_PATH_PREFIX + "result.jpg"; int main() { Mat img = imread(IMAGE_PATH_PREFIX + "boat1.jpg"); imgs.push_back(img); img=imread(IMAGE_PATH_PREFIX+"boat2.jpg"); imgs.push_back(img); img=imread(IMAGE_PATH_PREFIX+"boat3.jpg"); imgs.push_back(img); img=imread(IMAGE_PATH_PREFIX+"boat3.jpg"); imgs.push_back(img); img=imread(IMAGE_PATH_PREFIX+"boat4.jpg"); imgs.push_back(img); img=imread(IMAGE_PATH_PREFIX+"boat5.jpg"); imgs.push_back(img); img=imread(IMAGE_PATH_PREFIX+"boat6.jpg"); imgs.push_back(img); Mat pano;//拼接結果圖片 //Stitcher stitcher = Stitcher::createDefault(try_use_gpu); Stitcher stitcher = Stitcher::createDefault(true); Stitcher::Status status = stitcher.stitch(imgs, pano); if (status != Stitcher::OK) { cout << "Can't stitch images, error code = " << int(status) << endl; return -1; } imwrite(result_name, pano); } int main_test_feature_algo(){ #ifdef HAVE_OPENCV_XFEATURES2D cout << "Surf" << endl; #else cout << "Orb" << endl; #endif }
當然你也可以看下opencv-3.0.0/samples/cpp/stitching.cpp的代碼
效果圖: