失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 基于Stitcher类的全景拼接

基于Stitcher类的全景拼接

时间:2019-08-25 07:58:19

相关推荐

基于Stitcher类的全景拼接

一、算法目的

实现两张图片的全景拼接。本次实验针对不同场景做全景拼接:

室内场景室外景深落差较大的场景室外景深落差较小的场景

二、Opencv stitch原理

1.源码:/2.4.2/modules/stitching/doc/high_level.html?highlight=stitcher#stitcher

2.基于SURF算法的特征点检测

在源码中,特征点检测的默认设置第一选择是SURF,第二是ORB特征点检测。先对图一进行特征点提取和筛选匹配,再对图二进行该操作,这样可以保证更多的匹配点被选中。

SURF(Speeded Up Robust Features, 加速稳健特征) 是一种稳健的图像识别和描述算法。它是SIFT的高效变种,也是提取尺度不变特征,算法步骤与SIFT算法大致相同,但采用的方法不一样,SURF算法要比SIFT算法更高效。SURF使用海森(Hesseian)矩阵的行列式值作特征点检测并用积分图加速运算;SURF 的描述子基于 2D 离散小波变换响应并且有效地利用了积分图。

2.1特征点检测:SURF使用Hessian矩阵来检测特征点,该矩阵是x,y方向的二阶导数矩阵,可测量一个函数的局部曲率,其行列式值代表像素点周围的变化量,特征点需取行列式值的极值点。用方型滤波器取代SIFT中的高斯滤波器,利用积分图(计算位于滤波器方型的四个角落值)大幅提高运算速度。

2.2特征点定位:通过特征点邻近信息插补来定位特征点。

2.3方向定位:通过计算特征点周围像素点x,y方向的哈尔小波变换,并将x,y方向的变换值在xy平面某一角度区间内相加组成一个向量,在所有的向量当中最长的(即x、y分量最大的)即为此特征点的方向。

2.4特征描述子:选定了特征点的方向后,其周围相素点需要以此方向为基准来建立描述子。此时以5*5个像素点为一个子区域,取特征点周围20*20个像素点的范围共16个子区域,计算子区域内的x、y方向(此时以平行特征点方向为x、垂直特征点方向为y)的哈尔小波转换总和Σdx、ΣdyΣdx、Σdy与其向量长度总和Σ|dx|、Σ|dy|Σ|dx|、Σ|dy|共四个量值,共可产生一个64维的描述子。

3.对图像特征点进行匹配,使用最近邻和次近邻方法,将两个最优的匹配的置信度保存下来。

4.对图像进行排序以及将置信度高的图像保存到同一个集合中,删除置信度比较低的图像间的匹配,得到能正确匹配的图像序列。这样将置信度高于门限的所有匹配合并到一个集合中。

5.对所有图像进行相机参数粗略估计,然后求出旋转矩阵

6.使用光束平均法进一步精准的估计出旋转矩阵。

7.波形校正,水平或者垂直

由于拍摄照片的时候角度不一定是相同的,所以拼接起来的照片会使全景图出现“飞机曲线”,因此要对图像进行波形矫正,主要是寻找每幅图形的“上升向量”,使它矫正成.

8.拼接

9.融合,多频段融合,光照补偿

由于拍照的时候角度光线等原因,会使图片的亮度不同,因此需要对图像进行光照补偿,将对应区域乘以一个值。

三、实验结果

1.室内场景

(a)(b)

图1

图一是两幅集美大学陈延奎图书馆的图像,对这两幅图进行全景拼接:

图2

拼接的结果两张图中间看不出有缝隙,但是本该是直线的房顶拼接后变成了曲线。

2.室外景深落差较大的场景

(a)(b)

图3

图3是两张在集美大学庄汉水楼的光线差异较大的图片,对其进行全景拼接:

图4

拼接后的图片中间缝隙不明显,并且光线进行了补偿,将图3(a)进行了变暗处理,是两幅图无缝连接,达到较理想的效果。

3.室外景深落差较小的场景

(a)(b)

图5

图5是两张光线较一致的图片,对其进行全景拼接:

图6

图6达到较为理想的预期效果。

四、调用stitch方法的代码

1 import numpy as np 2 import cv2 3 from cv2 import Stitcher 4 5 if __name__ == "__main__": 6img1 = cv2.imread('C:/Users/w/PycharmProjects/quanjingpinjie/picture/11.png') 7img2 = cv2.imread('C:/Users/w/PycharmProjects/quanjingpinjie/picture/9.jpg') 8stitcher = cv2.createStitcher(False) 9#stitcher = cv2.Stitcher.create(cv2.Stitcher_PANORAMA), 根据不同的OpenCV版本来调用10(_result, pano) = stitcher.stitch((img1, img2))11cv2.imshow('pano',pano)12cv2.waitKey(0)

View Code

如果觉得《基于Stitcher类的全景拼接》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。