opencv实现的全景图种类与步骤

opencv实现的全景图种类与步骤,第1张

  全景图概述

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

  

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

  整个全景拼接的算法流程来说,其实并不算复杂,至少在OpenCV的条件下如此。因为OpenCV自带了很多函数,完全可以搞定很多内容。

  1.选图,两张图的重叠区域不能太小,我个人认为最少不少于15%,这样才能保证有足够的角点匹配。

  2.角点检测。这一步OpenCV提供了很多种方法,譬如Harris角点检测,而监测出的角点用CvSeq存储,这是一个双向链表。

  3.角点提纯。在提纯的时候,需要使用RANSAC提纯。OpenCV自带了一个函数,FindHomography,不但可以提纯,还可以计算出3x3的转换矩阵。这个转换矩阵十分重要。

  4.角点匹配。经过提纯后的角点,则需要匹配。

  5.图像变换。这一步我曾经尝试过很多办法,最后选择了FindHomography输出的变换矩阵,这是一个透视变换矩阵。经过这个透视变换后的图像,可以直接拿来做拼接。

  6.图象拼接。完成上面步骤之后,其实这一步很容易。

  7.球面变换。这一步需要对坐标系进行转换,从平面坐标到球面坐标。

  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

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

  

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2717697.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存