OpenCv 3d 拼接全景图

Posted

技术标签:

【中文标题】OpenCv 3d 拼接全景图【英文标题】:OpenCv 3d Stitching Panorama 【发布时间】:2016-09-01 11:02:14 【问题描述】:

我有 7 张来自 gopro 的图像(装备中有 5 个摄像头,一个用于顶部,一个用于底部,它们都是 gopro 摄像头)。我想将所有这些图像拼接在一起以创建 3d 全景图。我已经能够使用 opencvstitching_detailed.cpp 在 Rig 中拼接 5 个图像。文件链接:

https://raw.githubusercontent.com/opencv/opencv/master/samples/cpp/stitching_detailed.cpp

但我不确定如何缝合顶部和底部(对我来说,现在底部并不那么重要,但我必须对顶部做一些事情)。知道如何做到这一点吗?如果我也可以使用相同的stitching_detailed.cpp 缝合顶部,请告诉我。

以下链接包含我正在使用的图像。它还包含我在 rig 中拼接图像得到的结果。

https://drive.google.com/folderview?id=0B_Bl8s2ePunQcnBaM3A4WDlDcXM&usp=sharing

【问题讨论】:

如果有足够的特征,这个拼接代码会拼接所有的图像(水平和垂直)。可能是顶部和底部的图像没有太多的重叠区域和特征可以缝合。你能给我你正在使用的图像吗? 我添加了我正在使用的图片的链接。 实际上我必须以编程方式执行此操作。我必须实时将视频拼接在一起。这只是视频中的一帧。 【参考方案1】:

所以首先你需要了解stitching_detailed.cpp 是如何工作的。 1. 使用SURF/ORB/SIFT左右在每张图像中检测特征关键点。然后对于每个图像对,找到最佳特征匹配并计算单应矩阵并获得每对图像的内点数

(*finder)(img, features[i]); 


 BestOf2NearestMatcher matcher(try_cuda, match_conf);
 matcher(features, pairwise_matches);

    所有这些对都被传递到 leaveBiggestComponent 以获得最大的图像集,它们属于全景图。

    根据上面得到的集合计算相机参数或每张图像并进行变形和混合。

第 1 步将找到每对的单应性并生成内点数。第 2 步将删除所有置信度因子(内点数)小于阈值的图像对。由于 cam7 img 的特征如此之少,并且与任何其他图像几乎没有重叠区域,它会在 leavebiggestcomponent 步骤中被拒绝。

你可以在这个链接中看到 features 和 mtaching(我用过 orbfeatures)

https://drive.google.com/open?id=0B2wDitsftUG9QnhCWFIybENkbDA

我也没有改变图像大小,但我想将图像大小减小一点(可能减半)会产生更多的特征点

您可以做的是减少您拍摄帧进行拼接的时间间隔。为了获得好的效果,图像之间必须至少有 40% 的重叠区域。

【讨论】:

非常感谢这个详细的回答。其实我是用PRO7 Bullet360来拍的。链接:shop.360rize.com/PRO7-360-VIDEO-VR-p/pro7e.htm。我想问一件事,如果我想降低这个阈值,以便进行某种强制拼接,以免图像 7 被丢弃,有没有办法做到这一点? 还有一件事你是说这个仪器在这种封闭的环境下不能工作吗? 你可以改变阈值 float match_conf = 0.3f;和浮动 conf_thresh = 1.f;但它可能会产生一些错误 如果你知道每个相机的方向,那么你可以直接将相机的旋转矩阵提供给上面代码的cameras.R。

以上是关于OpenCv 3d 拼接全景图的主要内容,如果未能解决你的问题,请参考以下文章

3d全景效果图如何制作?

Opencv图像拼接或全景

浏览器中实现3D全景浏览

基于Python和openCV实现图像的全景拼接

三维全景图是怎么做的?

VR全景图怎么做?