【问题标题】:opencv: reprojectImageTo3d what is the metric unit of the (X,Y,Z) point?opencv:reprojectImageTo3d(X,Y,Z)点的公制单位是什么?
【发布时间】:2019-07-23 02:59:59
【问题描述】:

首先,我想知道我们从 opencv reprojectImageTo3D() 函数得到的 3d 点的公制单位。

其次,我用“mm”作为公制单位的棋盘分别校准了每个相机,然后使用opencv函数校准立体系统,校正立体对,然后计算视差图。

基本上我想要边界框中心的距离。 所以我计算视差图并使用 reprojectImageTo3D() 函数将其重新投影到 3D,然后我从那些 3D 点中获取,即对应于 bbox 中心 (x, y) 的点。 但是我应该使用哪个图像来获得 bbox 的中心?改正的还是原来的?

其次,对立体系统使用相同型号的相机是否更好?

谢谢

【问题讨论】:

    标签: python opencv computer-vision depth disparity-mapping


    【解决方案1】:

    在校准过程中 (calibrateCamera),您必须提供校准目标的点网格。然后,您在此处提供的单位将为该过程的其余部分定义单位。 调用reprojectImageTo3D 时,您可能使用了stereoRectify 输出的矩阵Q,它接受了单独的校准(cameraMatrix1cameraMatrix2)。这就是单位的来源。 所以在你的情况下,我猜你会得到 mm。

    reprojectImageTo3D 必须使用校正后的图像,因为视差是使用校正后的图像计算的(否则将无法正确对齐)。此外,在计算视差时,它是相对于给定的第一张图像(文档中的左侧)计算的。因此,如果您像这样计算视差,则应该使用左校正图像:cv::StereoMatcher::compute(left, right)

    我从来没有使用过两个不同的相机,但使用相同的相机是有意义的。我认为,如果您有非常不同的彩色图像、边缘或任何图像差异,则可能会影响视差质量。 实际上非常重要(除非您只处理静态图片)是使用可以通过硬件同步的相机(例如 GENLOCK 信号:https://en.wikipedia.org/wiki/Genlock)。如果您在左右和移动的主体之间有一点延迟,则视差可能是错误的。校准也是如此。

    希望这会有所帮助!

    【讨论】:

    • 最小视差或视差数量取决于场景。如果您的场景中有非常远和近的物体,则必须进行检查,否则您可能会使视差“饱和”(您的点云对于某些部分将是平坦的)。其他参数产生了一些差异,但我还无法正确评估哪些参数是最好的。如果不知何故你在重建后有一个注册过程,因此有一个基本事实,你可以检查多个参数,最低的注册错误,但在我的情况下,我还没有这样的基本事实。
    • 谢谢,确实对我有很大帮助!其次,调整参数的最佳方法是什么?我已经修改了一个 GUI 来实时调整,但不确定要使用哪个视差图。从cv::StereoMatcher::compute(left, right) 调整视差图更好还是调整我们在过滤后得到的视差图更好
    • 就我而言,我在过滤之前评估了结果,但我无法详细说明为什么在之前或之后这样做更有意义。对我来说,首先过滤尽可能干净的东西更直观。所以通过查看未过滤的点云来调整参数更有意义。我们也可以争辩说这最好在事后过滤,因为它实际上是你感兴趣的最终结果。我不得不承认我还没有分析视差过滤算法。
    猜你喜欢
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 2014-10-01
    • 1970-01-01
    • 2014-12-13
    • 2013-02-26
    • 2015-07-02
    • 2022-08-22
    相关资源
    最近更新 更多