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(); //等待,防止控制台一闪而过
}

在这里插入图片描述

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