reprojectImageTo3D-我在哪里获得Q

2020年10月4日 34点热度 0条评论

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

到目前为止,我有2张2D图像,并具有所有特征点,匹配项,good_matches,基本矩阵和同质矩阵。另外,我还使用StereoBM计算了视差图。下一步应该是从所有这些值中获得3D点云。

我检查了互联网,发现

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

使用这种方法,我应该能够重新创建3D点云...当前的问题是,我没有MatrixQ。

我想我会从方法中得到

stereoRectify(...);

但是由于我在这种情况下应避免使用cameraCalibration,因此无法使用此方法。另类

stereoRectifyUncalibrated(...);

不提供Q ...

有人可以帮助我,告诉我如何以更简单的方式获得Q或点云吗?

谢谢

解决方案如下:

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

相机校准是估算这些值的常用方法。您的厨师说这不是一种选择,但是有几种不同的技术(例如,使用棋盘或通过autocalibration),具有各种要求和可能性。因此,准确调查为什么不进行校准可能会找到适合您的应用的方法。

如果您真的无法估计内在函数,则可能的解决方案是使用两个以上的图像进行Bundle Adjustment。但是,如果没有内在函数,则3D重​​建可能不会很有用。这引出我的第二点。

3D重建有几种类型,主要类型是:射影,度量和欧几里得。 (有关此内容的更多详细信息,请参阅第二版的Hartley&Zisserman撰写的“计算机视觉中的多 View 几何”中的§10.2p 264)

  • 欧几里得重建是大多数人所说的“3D重建”的意思,尽管不一定是他们所需要的:仅通过3D旋转和3D平移(即3D坐标的变化)与真实模型相关的场景模型系统)。因此,在这样的模型中,场景中的正交角是正交的,并且场景中1米的距离对应于模型中的1米。为了获得这样的欧几里得3D重建,您需要知道至少一些相机的内在函数以及场景中两个给定点之间的真实距离。
  • 度量或相似度重建在大多数情况下足够好,它是指场景的3D模型,该场景通过相似度变换(即通过3D旋转和3D平移(即, 3D坐标系)以及整体缩放比例。为了获得这样的度量重建,您需要至少了解一些摄像机的内在函数。
  • 如果您不了解场景或相机的本征,则将获得投影重建。这样的3D模型相对于所观察的场景不是按比例的,并且场景中正交的 Angular 可能在模型中不正交。
  • 因此,如果您想进行精确的重建,了解(某些)摄像机的内在参数至关重要。