opencv下拼接

優點:可拼接多張:
缺點:速度較慢,(還有不知道是不是我選擇圖片的原因變形較大,出現4張拼接出現模糊,5張直接內存溢出估計是圖片太大了)
1.我來針對缺點填坑了(3圖往往是一個極限值(這也可能就是爲什麼opencv裏面的例子提供的是3圖),當第四圖出現的時候,其單應(轉換模型)效果非常差),這個博客也說了這個問題
2.圖形變形較大,拍攝的地物不是位於一個平面,看了上述問題,我突然想起來老師給我說的單應矩陣的適應範圍(平面。旋轉、平移只能位於一個平面纔可以,想打死自己的心都有)怪不得我自己寫的有時候可以(某公開數據集的符合單應變化的圖像),有時候不行(無人機拍的不行,很大程度是不在一個平面,角度、航高都會變化)

實現思路:

講一下實現思路吧:

  1. 特徵點提取、描述
  2. 特徵匹配 誤匹配剔除
    (單應矩陣是同時計算,不知道非平面是怎麼計算變換模型,瞭解後再來填坑)
  3. 利用變換模型,對待配準圖像進行變換
  4. 將圖像拼接到一塊(後者沒有看到很好的方面、會存在圖像邊角缺失)
  5. 優化
    有幾個博客有這方面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(); //等待,防止控制檯一閃而過
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章