zoukankan      html  css  js  c++  java
  • 基于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

          

  • 相关阅读:
    Python基础:数据类型-列表与元组(6)
    Python基础:数据类型-数字(5)
    Python基础:编码规范(4)
    Python基础:语法基础(3)
    Python基础:第一个Python程序(2)
    Python基础:搭建开发环境(1)
    Vue.js 2.x笔记:服务请求axios(8)
    Vue.js 2.x笔记:状态管理Vuex(7)
    一位资深传统型软件开发者的思考:传统软件企业危机四伏【转】
    基于cesium的GIS洪水淹没三维模拟系统
  • 原文地址:https://www.cnblogs.com/wenbozhu/p/10617647.html
Copyright © 2011-2022 走看看