360度全景问题--首尾相接

相机固定在一个点,旋转相机得到4幅图:img_A、img_B、img_C、img_D 相互之间有点重叠,整体景象覆盖360度。使用PTGuiViewer观察首尾是否相接,很多人写拼接融合但很少人写首尾相接问题。故研究下。

   

 参考:

OpenCV Stitching Module によるパノラマ画像合成の解説 【カメラの話】 - Qiita

OpenCV总结6——stitcher_windxgz的博客-CSDN博客_opencv stitcher

Opencv 使用串联匹配图像拼接_Enjoy lab and life的博客-CSDN博客

1、我以前读研时搞的东西都只是考虑拼接成一幅完整图片,而从来没考虑过使用PTGuiViewer查看是否img_A和img_D之间是否可以无缝巡航。因为以前只是将img_D拼接到img_C,再将结果拼接到img_B,再将新结果拼接到img_A,形成的最终结果可以通过PTGuiViewer看到一个很大的缝隙:

如上图看到很大的一条裂缝!!!这说明首尾并不相接。

2、针对上述情况,我查了些资料,发现很少资料阐述。首先要进行处理选择一幅图信息最少的地方作为首和尾,因为信息少所以肉眼看起来无缝感更强。

如上所述,我选的是img_D,将img_D从中央一分为二:img_D_left、img_D_right。所以此时的顺序就是img_D_right、img_A、img_B、img_C、img_D_left,此时如果将这5幅图从右到左拼接起来,发现还是有缝隙:

可以看到这条缝隙。其实即使不用PTGui也可猜到不会无缝,因为下图右上角和右边有缝,这是因为累积误差所致!

opencv中是:

A、估计完相机参数CameraParams 、

B、然后用光束平差法BundleAdjusterRay对相机参数进行调整、并得到每幅图的焦距

C、对焦距排序,取中值作为调整参数来再次调整相机参数,并得到每幅图的新尺寸和中心

D、然后对每幅图变换。

可以看到缝隙的确改善很大,但是仍有缝隙。

3、然后我又查了资料,将结果图的四个顶点计算新的变换矩阵,以弥补这条缝隙:

可以看到虽然没缝隙了,但不能这样强制拉扯!!!

4、然后查资料发现只有img_D_right、img_D_left之间完全对齐即首尾必须完全对齐时,如下图,通过PTGui可看出整组图之间已无缝,也无错位,实现了360度无缝首尾巡航!!!

 img_D_right放在result最左端一直不动,然后将result的右端完全和img_D_left匹配才会有上图的结果!!!才能达到完全无缝。

5、在进行上个步骤时,发现为什么有很多将右边图拼到左边,但很少有人将左边图拼到右边的情况???我发现我把左图拼到右边时不能达到上图的完全无缝,而是会有缝如下图:

 可以看到有细缝,从下到上慢慢变大!!!是不是因为这样所以才没人这样做??我查了下:

但我试了下翻转图像,然后始终用右边拼到左边,可发现并不对,缝很大!为什么不能flip然后按常规的右图拼到左图,再flip回来?!!!有大神的话麻烦告知。

 但第一个回答那种方法我还没空试,偶尔周末才有时间搞。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
可以使用Google VR SDK来展示360全景图。首先,你需要将全景图作为纹理加载到OpenGL ES中,并将其用作天空盒子的背景。然后,你可以创建一个Sphere(球体)或者Cube Map(立方体映射)来渲染全景图。接下来,你可以使用Google VR SDK提供的GvrView组件来创建一个VR场景,并将渲染的全景图作为场景的背景。最后,你可以使用GvrView组件提供的控制器来让用户在VR场景中移动和交互。 以下是一个简单的示例代码: ``` public class MainActivity extends AppCompatActivity { private GvrView gvrView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); gvrView = findViewById(R.id.gvr_view); gvrView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); gvrView.setRenderer(new MyRenderer(this)); gvrView.setTransitionViewEnabled(false); // Enable VR Mode. gvrView.setStereoModeEnabled(true); gvrView.setDistortionCorrectionEnabled(true); // Enable Cardboard-trigger feedback. gvrView.enableCardboardTriggerEmulation(); // Associate the GvrView with this activity. gvrView.setTransitionViewEnabled(false); gvrView.setOnCloseButtonListener(new Runnable() { @Override public void run() { finish(); } }); } @Override protected void onResume() { super.onResume(); gvrView.onResume(); } @Override protected void onPause() { super.onPause(); gvrView.onPause(); } @Override protected void onDestroy() { gvrView.shutdown(); super.onDestroy(); } } ``` 你同样需要实现一个MyRenderer类,它继承自GvrView.Renderer,并在onDrawFrame()方法中渲染全景图
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元气少女缘结神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值