全景图概述

每当一个平面图像映射到一个弯曲的表面就会发生图象投影,反之亦然,这中现象特别常见于全景摄影。例如地球的球面可以映射到一块平坦的纸张。由于在我们周围的整个视场的可以被认为是作为球体的表面(对于所有观测角度),我们需要一种能将球形投影到2-D平面以便照片打印的方法。

小的视角相对容易进行形变并投影到平坦的纸上。但是,当试图把一个球形图像映射到一个平面上,有些变形是不可避免的。因此,每一种类型的投影仅仅尝试避免一种类型的失真,这是以牺牲其他失真为代价的。随着视场角增大,观测弧(viewing arc)变得更弯曲,从而全景投影类型之间的差异变得更加显着。什么时候使用那一种投影,在很大程度上取决于每个投影应用。 在这里,我们集中介绍在几个最常用。

全景图的种类

Equirectangular: 将球形的经度和纬度坐标,直接到水平和垂直坐标的一格,这个网格的高度大约是宽的两倍。因此从赤道到两极,横向拉伸不断加剧,南北两个极点被拉伸成了扁平的网格在整个上部和下部边缘。 Equirectangular可以实现整个水平和竖直的360全景。
圆柱投影: 类似equirectangular,只是随着目标接近南北两极,纵向也会拉伸,两极会发生无限的纵向拉伸(因此这个扁平网格的顶部和底部没有水平线) 。由于这个原因,柱面投影不太适合具有非常大的垂直视角的图像。柱面投影是传统摆动镜头全景胶片相机所提供的标准投影方式。其对于目标尺寸的保持比直线投影更准确,然而这样就将平行于观测者视线的直线渲染成了曲线。
直线投影:主要优点在于,它把三维空间中的所有直线映射成二维网格上的直线。这种投影类型是大多数普通广角镜头所希望的,所以这也许是我们最熟悉的投影方式。它的主要缺点是,随着视角增加,它会大大加剧透视效果,从而导致在图像的边缘的对象产生歪斜。因此,对于远大于120度的全景图,一般不推荐直线投影。
直线投影:主要优点在于,它把三维空间中的所有直线映射成二维网格上的直线。这种投影类型是大多数普通广角镜头所希望的,所以这也许是我们最熟悉的投影方式。它的主要缺点是,随着视角增加,它会大大加剧透视效果,从而导致在图像的边缘的对象产生歪斜。因此,对于远大于120度的全景图,一般不推荐直线投影。

摩卡托投影:和圆柱以及equirectangular投影关系非常密切。是这两种类型之间的一种折衷。和柱面投影相比,其产生更小的垂直拉伸和更大的可用的垂直角度,但是直线会更加弯曲。这个投影方式最有名的应用就是在平面地图上,我们也注意到,这个方法的另一种变形:横轴摩卡托投影,可以被用于生成很高的纵向全景图。

正弦投影:目标是保持所有网格区域的面积。如果用这种投影将地球变平,可以使用反变换再次形成一个面积和形状不变的球体。面积相等的特性是非常有用的,因为其保持了一致的水平和竖直分辨率。此投影类似的鱼眼和立体图投影,但它保持了纬线的完全水平。

立体图投影:和鱼眼投影类似,但它通过随着目标远离透视中心,逐渐进行拉伸的方法,保持了更好的透视感。这种透视增长的特性有点类似与直线投影的效果。

OpenCV快速实现全景拼接

最新版的opencv2.4里面有很多新元素。 stitching module 就是一个非常有用的. 在opencv的例程文件夹里,有一个很好的脚本叫做 stitching_detailed.cpp. 这个脚本包括了创建全景图的全部过程,包括特征提取,匹配,warp,以及合成。安装好opencv以后,可以简单的通过命令行来测试这个例程:

$ ./stitching_detailed Univ*.jpg

这会使用默认参数来创建一个result.jpg的最终文件,来源的图片是以 "Univ"开头的jpg图像. 可以通过help察看一些设置

$ ./stitching_detailed --help

例如,可以改变投影的方式,默认是球面投影. 下面的例程用摩卡托投影法:

$ ./stitching_detailed Univ*.jpg --warp mercator

结果如下:原图像可以在这里找到

柱面

平面

摩卡托

参考文献:

http://www.cambridgeincolour.com

http://wiki.panotools.org

http://mathworld.wolfram.com

http://www.janeriksolem.net

全景图的种类及opencv实现相关推荐

  1. 全景图的种类、360度三维实拍全景

    (转载地址:http://blog.sina.com.cn/s/blog_4b27c38d01019xlv.html 谢谢作者的分享) 根据全景外在表现形式可以分为柱形全景和球形全景两大类.柱形全景是 ...

  2. SpringBoot整合opencv实现全景图切割

    SpringBoot整合openCV实现360全景相机拍摄的全景图切割,话不多说,直接上代码 1.获取opencv-452.jar 首先,切割全景图需要使用到openCV的依赖jar,这个jar可以通 ...

  3. 全景视频拼接(二)--OpenCV源码解析

    本文参考:http://blog.csdn.net/skeeee/article/details/19480693,做了一定修改和补充. 一.stitching_detail程序运行流程 1.命令行调 ...

  4. [转载]全景视频拼接(二)--OpenCV源码解析

    转载自 [https://blog.csdn.net/App_12062011/article/details/52438357] 本文参考:http://blog.csdn.net/skeeee/a ...

  5. opencv 4计算机视觉项目实战_资源|计算机视觉实战操作(PDF下载)

    这是近一两年来分享的关于计算机视觉实战相关的项目汇总.理论总是枯燥乏味的,公式又是那么晦涩难懂,而视觉的魅力就在于,完美的数学公式后,隐藏着惊艳令人惊艳的结果.但是,如果有人告诉你,你需要先学会数学, ...

  6. 资源|计算机视觉实战操作(PDF下载)

                 这是近一两年来分享的关于计算机视觉实战相关的项目汇总. 理论总是枯燥乏味的,公式又是那么晦涩难懂,而视觉的魅力就在于,完美的数学公式后,隐藏着惊艳令人惊艳的结果.但是,如果有 ...

  7. 计算机视觉黑魔法 | 16个案例

                 这是近一两年来分享的关于计算机视觉实战相关的项目汇总. 理论总是枯燥乏味的,公式又是那么晦涩难懂,而视觉的魅力就在于,完美的数学公式后,隐藏着惊艳令人惊艳的结果.但是,如果有 ...

  8. Python调用安民威视、海康威视等网络摄像头方法(并实现KCF目标追踪和代码)

    一.利用OpenCv调用网络摄像头 核心:调取网络摄像头的核心是利用rtsp通道来获取网络摄像头的信息流. (1)首先需要将电脑网络与摄像头网络处于同一个局域网或交换机下. (2)查询摄像头的用户名( ...

  9. 【高空无人机视角下的路口车辆与行人检测跟踪与轨迹刻画】

    [高空无人机视角下的路口车辆与行人检测跟踪与轨迹刻画] 背景需求 可参考的方法 1. opencv + python 实现目标跟踪的方法: 主要代码 ① main.py ② items.py 检测效果 ...

最新文章

  1. 哪些人交不到真朋友?
  2. 通用AI咋发展?向大脑学习是条路子
  3. LeetCode 3. 无重复字符的最长子串(Longest Substring Without Repeating Characters)
  4. 关于Dialog的简单体验
  5. SAP的SqlAnyWhere中数据库日志文件删除后如何新建
  6. 这些迹象表明公司即将裁员
  7. Linux mv命令:移动文件或改名
  8. Redis简单案例(三) 连续登陆活动的简单实现
  9. 用css实现星级评分效果
  10. isFinite使用说明
  11. Silverlight/Windows8/WPF/WP7/HTML5周学习导读(8月5日-8月12日)
  12. JS—图片压缩上传(单张) 1
  13. 左手用R右手Python系列之——表格数据抓取之道
  14. 趋势科技防毒墙-网络版(OfficeScan)客户端管理工具
  15. 基于cocos creator 3.4 实现虚拟摇杆
  16. 一文学会如何使用工厂模式
  17. 有向图的邻接矩阵的平方运算的含义
  18. 开源帮助:什么是退出代码 137,你能修复它吗?
  19. Java Logging之JUL系列——Log Levels
  20. 基于STM32F103+涂鸦三明治的宠物自动喂食器

热门文章

  1. 快速上手TiDB,体验全新的一栈式实时HTAP数据库
  2. 安装hadoop集群模拟大数据集群踩到的坑(一)
  3. 2013移动开发工具盘点:最火原型设计工具
  4. Qt开源库-顶级浮动窗口系统-Advanced-Docking-System【01】
  5. 【数学】二阶非齐次微分方程的解法
  6. java技术及ssh框架和jsp技术的介绍 外文文献及翻译_java技术及ssh框架和jsp技术的介绍 外文文献及翻译.doc...
  7. 第十七章 : 网络系统
  8. javascript读写二进制
  9. 大陆二代居民身份证校验代码
  10. Centos网络操作之IP、网关、路由、防火墙