1

我在没有 NDK 的情况下在 Android 上使用 OpenCV 时遇到了一些问题。
目前我正在我的大学做一个项目,我的厨师告诉我,在从 2D 图像重建 3D 对象时,我应该避免相机校准。

到目前为止,我有 2 张 2D 图像,并且拥有所有的特征点、匹配、good_matches、基本矩阵和齐次矩阵。此外,我还使用 StereoBM 计算了视差图。下一步应该是从所有这些值中获取 3D 点云。

我检查了互联网,发现

Calib3d.reprojectImageTo3D(disparity, _3dImage, Q, false);

使用这种方法,我应该能够重新创建 3D 点云......目前的问题是,我没有矩阵 Q。我想我会从方法中得到这个

stereoRectify(...);

但是由于我应该避免在这种特定情况下使用 cameraCalibration,所以我不能使用这种方法。替代方案

stereoRectifyUncalibrated(...);

不提供Q...

有人可以帮助我并向我展示如何以更简单的方式获得 Q 或点云吗?谢谢

4

1 回答 1

5

要回答您的问题Q所需的矩阵reprojectImageTo3D表示从像素位置和相关视差(即形式[u; v; disp; 1])到相应 3D 点的映射[X; Y; Z; 1]K不幸的是,如果不知道相机的内在因素(矩阵)和外在因素(两个相机姿势之间的旋转和平移),就无法得出这种关系。

相机校准是估计这些的常用方法。您的厨师说这不是一种选择,但是有几种不同的技术(例如使用棋盘,或通过自动校准)具有各种要求和可能性。因此,准确调查校准不适用的原因可能有助于找到适合您应用的方法。

如果你真的无法估计内在函数,一个可能的解决方案可能是捆绑调整,使用不只是 2 个图像。然而,如果没有内在函数,3D 重建可能不会很有用。这就引出了我的第二点。

有几种类型的 3D 重建,主要类型是:投影、度量和欧几里得。(有关这方面的更多详细信息,请参阅 Hartley & Zisserman,第 2 版的“计算机视觉中的多视图几何”中的 §10.2 p 264)

  • 欧几里得重建是大多数人所说的“3D重建”,尽管不一定是他们需要的:场景模型仅通过3D旋转和3D平移(即3D坐标系的变化)与真实模型相关联)。因此,场景中的正交角度在这​​样的模型中是正交的,场景中 1 米的距离对应于模型中的 1 米。为了获得这样的欧几里得 3D 重建,您需要知道至少一些相机的内在特性以及场景中两个给定点之间的真实距离。

  • 度量相似度重建在大多数情况下已经足够好,它指的是场景的 3D 模型,它通过相似度变换与真实模型相关联,换句话说,通过 3D 旋转和 3D 平移(即 3D 的变化)坐标系)以及整体缩放。为了获得这样的度量重建,您至少需要知道一些相机的内在函数。

  • 如果您不了解场景或相机的内在特性,您将获得投影重建。这样的 3D 模型相对于观察到的场景不是按比例缩放的,并且场景中正交的角度在模型中可能不会正交。

因此,如果您想要准确的重建,了解(某些)相机的内在参数至关重要。

于 2014-03-12T20:26:58.300 回答