基于Stitcher类的全景拼接

一、算法目的

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

  1. 室内场景
  2. 室外景深落差较大的场景
  3. 室外景深落差较小的场景

二、Opencv stitch原理

   1.源码:https://docs.opencv.org/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__":
 6     img1 = cv2.imread('C:/Users/w/PycharmProjects/quanjingpinjie/picture/11.png')
 7     img2 = cv2.imread('C:/Users/w/PycharmProjects/quanjingpinjie/picture/9.jpg')
 8     stitcher = cv2.createStitcher(False)
 9     #stitcher = cv2.Stitcher.create(cv2.Stitcher_PANORAMA), 根据不同的OpenCV版本来调用
10     (_result, pano) = stitcher.stitch((img1, img2))
11     cv2.imshow('pano',pano)
12     cv2.waitKey(0)
View Code

 

 

 

 

 

      

 

posted @ 2019-03-31 17:42  wenboz  阅读(1372)  评论(0编辑  收藏  举报