【问题标题】:What do I do with the fundamental matrix?我如何处理基本矩阵?
【发布时间】:2019-11-24 03:27:41
【问题描述】:

我正在尝试从多个 2d 图像重建 3d 形状。 我已经计算了一个基本矩阵,但现在我不知道如何处理它。

我在堆栈溢出和学术论文中发现了多个相互矛盾的答案。 例如,Here 表示您需要根据基本矩阵计算旋转和平移矩阵。

Here 说你需要找到相机矩阵。

Here 说你需要找到同形异义词。

Here 说你需要找到极线。

它是什么? (我该怎么做?我已经阅读了the H&Z book,但我不明白。它说我可以“轻松”在结果 9.14 中使用“直接公式”,但结果 9.14 既不容易也不直接理解。)

堆栈溢出需要代码,所以这是我目前所拥有的:

    # let's create some sample data

    Wpts = np.array([[1, 1, 1, 1],  # A Cube in world points
                     [1, 2, 1, 1],
                     [2, 1, 1, 1],
                     [2, 2, 1, 1],
                     [1, 1, 2, 1],
                     [1, 2, 2, 1],
                     [2, 1, 2, 1],
                     [2, 2, 2, 1]])


    Cpts = np.array([[0, 4, 0, 1],  #slightly up
                     [4, 0, 0, 1],
                     [-4, 0, 0, 1],
                     [0, -4, 0, 1]])
    Cangles = np.array([[0, -1, 0],  #slightly looking down
                        [-1, 0, 0],
                        [1, 0, 0],
                        [0,1,0]])



    views = []
    transforms = []
    clen = len(Cpts)
    for i in range(clen):
        cangle = Cangles[i]
        cpt = Cpts[i]

        transform = cameraTransformMatrix(cangle, cpt)
        transforms.append(transform)
        newpts = np.dot(Wpts, transform.T)
        view = cameraView(newpts)
        views.append(view)



H = cv2.findFundamentalMat(views[0], views[1])[0]
## now what???  How do I recover the cube shape?

编辑:我不知道相机参数

【问题讨论】:

  • 可能是错误的,因为我还没有在那个领域工作,但是基本矩阵没有为您提供有关相机移动/位移的信息,并且您可以通过光线交叉使用立体重建(以最天真的方式)?
  • 这就是我的想法,但我看到关于如何做到这一点的相互矛盾的报告
  • 这篇文章很棒!我之前在计算机视觉/自动驾驶汽车职位的面试中遇到过这个问题。

标签: python opencv matrix 3d fundamental-matrix


【解决方案1】:

基本矩阵

首先,听fundamental matrix song ;)。

基本矩阵显示了 2 张图像(x' - 图像 2,x - 图像 1)中的点对应关系之间的数学关系。 “这意味着,对于所有对应点对都持有”(Wikipedia)。这也意味着,如果您的点对应异常或不正确,则会直接影响基本矩阵的质量。

另外,3幅图像之间的点对应关系也存在类似的结构,称为Trifocal Tensor。

仅使用基本矩阵的属性的 3d 重建是不可能的,因为“对极几何是两个视图之间的内在投影几何。它是 独立于场景结构,只依赖于相机的内部参数 和相对姿势。”(HZ,第 239 页)。

相机矩阵

关于如何从多张图像重建形状的问题,您需要了解图像的相机矩阵(K',K)。相机矩阵是由相机焦距或主距离(fx,fy)以及光学中心或主点(cx,cy)组成的3x3矩阵。


您可以使用相机校准推导出您的相机矩阵。

基本矩阵

当您了解相机矩阵后,您可以将基本矩阵扩展为基本矩阵 E。


你可以说你的基本矩阵现在已经“校准”了。

基本矩阵可用于获取第二张图像与第一张图像相比的旋转(旋转矩阵 R)和平移(向量 t),仅达到 投影重建。 t 将是一个单位向量。为此,您可以使用 OpenCV 函数 decomposeEssentialMatrecoverPose(使用手性检查)或阅读 HZ 中的进一步详细说明。

投影矩阵

了解您的平移和旋转后,您可以为图像构建投影矩阵。投影矩阵定义为。最后,您可以使用三角测量 (triangulatePoints) 导出图像点的 3d 坐标。我建议使用后续捆绑调整来获得正确的配置。 openCV中还有一个sfm模块。

由于单应性或极线知识对于 3d 重建并不是本质上所必需的,因此我没有解释这些概念。

【讨论】:

  • 对不起,我没有相机参数/矩阵
  • 我假设您的图像是 100x100 像素。如果您没有相机参数,则可以假设焦距(例如,图像大小的 0.75,fx,fy = 75),并且可以将光学中心设置为图像的中心(cx = 50,cy =50)。我想指出的是,校准相机或参考真实值(例如在图像的EXIF中)肯定更好
  • 我一直假设焦距为 1 个单位并尝试从那里进行校准,但未能产生任何可识别的结果。
  • 奇怪的是,您说 H&Z 说您无法从基本矩阵重建场景,而 pg 265 明确表示相反。 “如果两个视图中的一组点对应唯一地确定了基本矩阵,则可以仅从这些对应中重建场景和相机”
  • 今天问作者这个有用吗。他回答说:“......我认为更好的方法是猜测每个img的K矩阵,然后使用corresp.来求解初始度量reco。在成对的imgs之间使用5点法。即使你猜f错误地,它不会阻止您进行初始度量 reco,因为由于 dolly-zoom ambig,f 与 t 在很大程度上是模棱两可的,因此您仍然可以形成初始度量 reconstr。,因为您永远不必对你的 reproj. 进行降维。错误可能会比你开始使用 proj. 方法时要低。
【解决方案2】:

使用您的基本矩阵,您可以按照规定的规范形式确定相机矩阵 P 和 P' (HZ,pp254-256)。从这些相机矩阵中,您理论上可以对与真实场景在未知投影变换方面不同的投影重建进行三角测量。

需要注意的是,线性三角测量方法不适用于投影重建,如 (HZ,Discussion,p313) [“...这两种线性方法都不太适合投影重建,因为它们不是投影不变的。”] 因此,应该使用上述推荐的三角测量技术来获得有价值的结果(这实际上需要更多的工作来实现)。

从这个投影重建中,您可以使用自校准方法,这种方法可以在某些情况下工作,但不会产生您可以通过校准的相机获得的准确性和稳健性以及利用基本矩阵来计算运动参数。

【讨论】:

    猜你喜欢
    • 2017-06-05
    • 2021-12-13
    • 2013-05-12
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多