经典/深度SfM有关问题的整理[通俗易懂]

经典/深度SfM有关问题的整理[通俗易懂]这篇博客主要是记录一些实践或看论文过程中遇到的一些不好理解的问题及解释。

大家好,又见面了,我是你们的朋友全栈君。

  这篇博客主要是记录一些实践或看论文过程中遇到的一些不好理解的问题及解释。
  
  Q1:SfM里的尺度不变性指的是什么?
  A1:一般定义下,尺度不变性是指体系经过尺度变换后,其某一特性不变。比如,特征点检测算法SIFT,其检测到的特征点的尺度不变性是通过图像金字塔来实现的。这样,不管原图的尺度是多少,在包含了所有尺度的尺度空间下都能找到那些稳定的极值点,这样就做到了尺度不变。关于SIFT尺度不变性的更详细讲解,可以参考这篇博客
  
  Q2:单目相机SfM重建结果的尺度是怎么确定的?
  A2:传统方法中,单目重建是无法获取重建场景的尺度信息的。因此,要确定重建的尺度,需要使用额外的手段。比如:

  1. 已知某些物体的真实物理尺寸(或人为添加一个便于估算尺寸的物体一起进行重建),将其应用到重建出的三维空间中。
  2. 有其他传感器的辅助,比如深度传感器、LiDAR等可以提供参考。

  
  Q3:在初始化的时候,我们需要通过两张匹配的图像来使用对极几何约束求解相机外参。那么,已知图像对应匹配点,使用归一化八点法求出来的是E矩阵还是F矩阵?
  A3:在相机内参未知的情况下,如果使用的是像素坐标的对应点,那么求解出来的是F矩阵。在opencv上就有已经实现好的函数findFundamentalMat。然后,如果要进一步求解外参R和t,就需要获得E矩阵,然后通过E=t×R进行求解。E矩阵则需要通过其与F矩阵的关系来求解,即E=KTFK。但是,前面说到,相机内参是未知的。所以我们需要假设一个相机内参,可以设fx=fy=cx=w/2,cy=h/2。这里,w和h分别是图像的宽度和高度。虽然这样结果并不准确(这是必然的),但是这也算是未知内参情况下的一种切实可行的解决方案,且随着加入图像的增多以及BA的不断优化,重建的结果也会越来越好。
  
  Q4:图像的畸变是在BA时候才开始考虑的,那在初始化(第一次三角化和pnp)的时候怎么办?
  A4:如果没有对相机进行标定,或者重建的图像是一些网图的话,那么初始化的时候确实是没有考虑图像畸变的,这确实会造成不正确的结果。但是,对于增量式SfM而言,一开始其结果都是不准确的,需要靠后期不断加入新图像,不断进行BA来进行优化。
  
  Q5:深度学习方法中,图像的特征金字塔是怎么匹配的?
  A5:特征金字塔的构建方法一般是,将原图作为最底层的图像(分辨率最高),然后依次进行下采样,获得更高层的图像。在匹配时,将所有下采样得到的图像再上采样到与原始图像相同尺寸的大小,然后全部concatenate在一起,进行下一步处理。比如BANet就用到了图像金字塔。
  
  Q6:什么是逆深度空间,为什么要用逆深度空间?
  A6:逆深度(Inverse depth)是近年来SLAM研究中出现的一种广泛使用的参数化技巧。它使用深度的倒数(也就是逆深度)来进行参数化,因为逆深度的分布更贴近高斯分布。在实际应用中,逆深度也具有更好的数值稳定性,从而逐渐成为一种通用的技巧。其他常用的参数化方式,比如用(x, y, z)表示三维点坐标,xyz三个参数都是离散随机的;而使用图像坐标(u, v)再加上一个深度信息d,也可以表示三维点坐标。
  
  Q7:深度学习论文中的warp是指什么?
  A7:warp就是将一个图像上的点变换到另一张图像上。比如在构建cost volume的时候,会需要将源图像上的像素点,通过一系列虚拟平面,warp到目标图像上,然后计算其代价。
  
  Q8:每个虚拟平面上的每个像素点的值是什么?
  A8:每个像素点的值为该点的损失(cost)。
  
  Q9:平面扫描(plane sweep)时的一系列虚拟平面和左右视图是一样大小的吗?
  A9:通常假设的一系列虚拟平面是垂直于目标视图z轴的,这样的话,这些虚拟平面就和目标视图的长宽是一样的了。而在将源视图warp到目标视图上的时候,若其坐标范围超出了目标视图的长宽,则直接舍弃;而虚拟平面上没有cost(即没有对应点)的地方通常设为0。
  
  Q10:增量式SfM重建出的场景尺度是由初始匹配对的尺度决定的。通常SfM重建出的尺度与场景的实际尺度是不同的,那么,该如何将重建尺度与实际尺度进行统一?
  A10:SfM在进行三维重建时,并没有除图像以外的其他位置、或比例尺信息,本质上是在一个任意坐标系下进行三维重建的。因此,重建的结果与实际的场景之间相差一个相似变换(尺度、旋转、平移)。可以通过控制点或者GNSS信息进行绝对定向,也可以通过已知物体的真实尺度与重建尺度,进行缩放求解。
  
  Q11:如果已经拥有一个场景重建的真值,现在又重建了一个三维场景,如何将新的场景与真值进行尺度、位置等的配准?
  A11:首先分别求解两个点云场景的坐标重心,然后分别获得两个重心到对应场景最远的一个点,将其连成一条线。基于这两条向量就能实现缩放旋转的配准了。当然这样误差可能会比较大,可以通过取更多的点来进一步减小误差。
  
  Q12:track就是特征点吗?
  A12:一个track是同一三维点在不同图像上被观测到的对应像素点,将这些像素点合起来称为track。track被观测到的次数越多表示这个三维点越稳健。在OpenMVG里,track只有2的三维点是会被直接舍弃掉的。
在这里插入图片描述
  
  Q13:本质矩阵E与基础矩阵F有什么关系,它们与像素点和归一化坐标点之间怎么对应?
  A13:有如下三个等式:

E=t[×]R
F=K-TEK-1
x2TEx1=p2TFp1=0

  其中,R和t分别是第二个相机的旋转矩阵和平移向量,t[×]则是向量t的反对称矩阵,K是相机内参,x表示归一化平面上的点,p表示像素坐标系下的像素点,p与x之间存在关系p=Kx。
  
  Q14:如何将重建出来的场景与真值进行对齐?
  A14:SfM重建出来的场景是尺度未定的,与真值(如果有的话)之间会相差一个相似变换,这个相似变换的求解及代码可以参考相机对齐方法介绍及实现代码(相似变换,包含旋转R、平移t、尺度s)
  
  
*未完待续,如果还有其他问题,后续会再进行补充。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151330.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月20日 下午5:36
下一篇 2022年6月20日 下午5:46


相关推荐

  • 在AWS EC2 Ubuntu上部署OpenClaw (原Clawdbot/Moltbot) 并对接飞书机器人

    在AWS EC2 Ubuntu上部署OpenClaw (原Clawdbot/Moltbot) 并对接飞书机器人

    2026年3月13日
    3
  • html使用vue axios,使用 Vue和axios

    html使用vue axios,使用 Vue和axios昨天写完了博客以后,有人就在我的博客下面留言说现在不是使用了Axios了吗?我赶紧再把Axios的例程给补上,并且做一个更新。其实vue-resource并不复杂,就是不稳定。Vue官方放弃它也是对的,作者是这样子说的最近团队讨论了一下,Ajax本身跟Vue并没有什么需要特别整合的地方,使用fetchpolyfill或是axios、superagent等等都可以起到同等…

    2025年6月29日
    4
  • GPS数据格式的分析与处理[通俗易懂]

    GPS数据格式的分析与处理[通俗易懂]GPS接收器的输出语句有:$GPGGA,$GPRMC,$GPVTG,$GPGSV,$GPGSA1.$GPGGA,GPS固定数据输出语句其标准格式为:$GPGGA,(1),(2),(3),(4),(5),(6),(7),(8),(9),M,(10),M,(11),(12)*hh(CR)(LF)以$GPGGA,082006.000,3852.9276,N,11527.4283,E

    2022年6月22日
    117
  • C语言数组 一维数组篇

    C语言数组 一维数组篇前言:本文章主要用于个人复习,追求简洁,感谢大家的参考、交流和搬运,后续可能会继续修改和完善。因为是个人复习,会有部分压缩和省略。一、数组1.数组的定义:2.C语言规定:数组的每个元素都有下标,且下标是从0开始的。3.数组的使用4.数组使用时可能出现的错误越界访问:经典题型5.判断两个数组类型是否相同:…

    2022年7月22日
    12
  • C语言实现有限状态机

    C语言实现有限状态机1 什么是有限状态机有限状态机在百度百科上的解释为 有限状态自动机 FSM finitestatem 或者 FSA finitestatea 是为研究有限内存的计算过程和某些语言类而抽象出的一种计算模型 有限状态自动机拥有有限数量的状态 每个状态可以迁移到零个或多个状态 输入字串决定执行哪个状态的迁移 有限状态自动机可以表示为一个有向图 2 有

    2026年3月19日
    2
  • 中标麒麟操作系统yum源配置

    中标麒麟操作系统yum源配置在 linux 系统上 解决软件包之间的依赖关系是很重要的事 很多工作无法实现可能就是因为缺少一个软件包 而当你千方百计找到这个软件包的时候 却发现它跟当前系统不兼容 所以 要做的非常重要的一件事情就是给系统添加软件仓库 以确保能安装使用大部分软件包 亲测 建议看完文章再动手配置实验环境 1 06 localhostDes uname aLinuxlocalh

    2026年3月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号