優點:可拼接多張:
缺點:速度較慢,(還有不知道是不是我選擇圖片的原因變形較大,出現4張拼接出現模糊,5張直接內存溢出估計是圖片太大了)
1.我來針對缺點填坑了(3圖往往是一個極限值(這也可能就是爲什麼opencv裏面的例子提供的是3圖),當第四圖出現的時候,其單應(轉換模型)效果非常差),這個博客也說了這個問題
2.圖形變形較大,拍攝的地物不是位於一個平面,看了上述問題,我突然想起來老師給我說的單應矩陣的適應範圍(平面。旋轉、平移只能位於一個平面纔可以,想打死自己的心都有)怪不得我自己寫的有時候可以(某公開數據集的符合單應變化的圖像),有時候不行(無人機拍的不行,很大程度是不在一個平面,角度、航高都會變化)
實現思路:
講一下實現思路吧:
- 特徵點提取、描述
- 特徵匹配 誤匹配剔除
(單應矩陣是同時計算,不知道非平面是怎麼計算變換模型,瞭解後再來填坑) - 利用變換模型,對待配準圖像進行變換
- 將圖像拼接到一塊(後者沒有看到很好的方面、會存在圖像邊角缺失)
- 優化
有幾個博客有這方面OpenCV代碼,就不貼:
https://blog.csdn.net/jidushanzhu/article/details/53258272
https://blog.csdn.net/yaningli/article/details/78551615
opencv源碼:
opencv這個拼接函數還是很強大的,估計考慮了不同的轉換模型
都能拼接(最好三張一拼);要有形變,兩張位置相同的圖片(儘管亮度有差異),會報錯
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <time.h>
#include <opencv2/features2d.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/core.hpp>
#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/legacy/legacy.hpp>
#include <opencv2/stitching/stitcher.hpp> //拼接頭文件
using namespace cv;
using namespace std;
void main()
{
std::vector< cv::Mat > vImg;
cv::Mat rImg, rImgs;
vImg.push_back(cv::imread("D:\\match_matlab\\data\\DSC05023.JPG"));
vImg.push_back(cv::imread("D:\\match_matlab\\data\\DSC05024.JPG"));
vImg.push_back(cv::imread("D:\\match_matlab\\data\\DSC05025.JPG"));
cv::Stitcher stitcher = cv::Stitcher::createDefault();
unsigned long AAtime = 0, BBtime = 0; //check processing time
AAtime = cv::getTickCount(); //check processing time
cv::Stitcher::Status status = stitcher.stitch(vImg, rImg);
BBtime = cv::getTickCount(); //check processing time
printf("Time consuming: %.2lf sec \n", (BBtime - AAtime) / cv::getTickFrequency()); //check processing time
if (cv::Stitcher::OK == status)
{
resize(rImg, rImgs, Size(), 0.1, 0.1);
cv::imshow("Stitching Result", rImgs);
imwrite("拼接.jpg", rImg);
}
else
printf("Stitching fail.");
cv::waitKey(0);
getchar(); //等待,防止控制檯一閃而過
}