优点:可拼接多张:
缺点:速度较慢,(还有不知道是不是我选择图片的原因变形较大,出现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(); //等待,防止控制台一闪而过
}