【问题标题】:OpenCV feature pairs to point cloudOpenCV 特征对到点云
【发布时间】:2019-08-24 11:40:19
【问题描述】:

我在两个立体图像中有一些 SIFT 特征,我正在尝试将它们放置在 3D 空间中。我找到了 triangulatePoints,这似乎是我想要的,但是,我遇到了参数问题。

triangulatePoints 有 4 个参数,projMatr1 和 projMatr2,这是我的问题开始的地方,projPoints1 和 projPoints2,这是我的特征点。 OpenCV 文档建议使用 stereoRectify 来查找投影矩阵。

stereoRectify 采用固有相机矩阵(我之前使用 calibrateCamera 计算过的)和校准后的图像大小。以及两个参数 R(旋转矩阵)和 T(平移向量),可以通过 stereoCalibrate 找到。

但是,stereoCalibrate 需要“对象点”,我很确定如果没有参考,我无法计算图像,这有点障碍。

这是从特征对计算 3D 位置的最佳方法吗?如果是这样,我如何在没有 stereoCalibrate 的情况下计算 projMatr1 和 projMatr2?

【问题讨论】:

  • 注意:我使用的是未过滤的 SIFT 点,所以其中一些是不准确的。我没有正确的立体设置 - 这只是我从两个稍微偏移的位置拍摄的照片。

标签: python opencv


【解决方案1】:

正如你所说,你没有校准,所以让我们忘记纠正。您想要的是点的深度,因此您可以将它们投影到 3D 中(然后仅使用一台相机的内在校准,主要是焦距)。

由于你没有整改,你不能指望确切的结果,所以让我们尽可能接近:

深度是焦距乘以基线除以视差,视差和焦距以像素为单位,深度和基线以(推荐)米为单位。

为了获得准确的视差,您需要一个经过校正的相机以及两张图像中的特征之间的对应关系。由于没有校准,你就没有纠正的希望,你可以尝试只使用原始图像来代替。相机越平行,它就会工作得越好。如果它们不平行,您将在此处引入错误,您的结果将变得不那么准确。如果这变得很糟糕,您必须找到一种方法来校准您的相机。

但最重要的是,您需要两幅图像中的特征之间的对应关系。在两个图像中运行 SIFT 是不行的。更好的方法是只在一张图像中运行 SIFT,然后为另一张图像中的每个特征找到相应的像素。有很多方法,我相信 OpenCv 内置了一些简单的块匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 2011-12-29
    • 2013-07-31
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多