我在没有NDK的Android上使用OpenCV遇到了一些问题。
目前我正在大学做一个项目,我的厨师告诉我,在从2D图像重建3D物体时,我应该避免相机校准。
到目前为止,我有2张2D图像,并且有所有的特征点,匹配,good_matches,基本矩阵和齐次矩阵。此外,我还使用StereoBM计算了视差图。下一步应该从所有这些值中获得3D点云。
我上网查了一下,发现
Calib3d.reprojectImageTo3D(disparity, _3dImage, Q, false);
使用这种方法,我应该能够重建3D点云…现在的问题是,我没有矩阵Q。我想我会从
方法中得到这个stereoRectify(...);
但是由于我应该避免针对这种特定情况的相机校准,所以我不能使用此方法。可选
stereoRectifyUncalibrated(...);
不提供Q…
有人可以帮助我,告诉我如何我可以得到Q或点云在一个更容易的方式?由于
为了回答你的问题, reprojectImageTo3D
所需的Q
矩阵表示从像素位置及其相关视差(即[u; v; disp; 1]
形式)到相应的3D点[X; Y; Z; 1]
的映射。不幸的是,如果不知道相机的内在特性(矩阵K
)和外在特性(旋转&两个相机姿势之间的转换)。
相机校准是估计这些的常用方法。你的厨师说这不是一个选择,但是有几种不同的技术(例如使用棋盘,或通过自动校准)有不同的要求和可能性。因此,准确地调查为什么不需要校准,可以找到适合您应用的方法。
如果你真的没有办法估计本质,一个可能的解决方案是Bundle Adjustment,使用多于2个图像。然而,如果没有这些特性,3D重建可能就不是很有用了。这就引出了我的第二点。
三维重建有几种类型,主要类型有:投影、度量和欧几里得。(有关这方面的更多详细信息,请参阅Hartley &齐瑟曼,第二版)
-
欧几里得重建是大多数人所说的"3D重建",尽管不一定是他们需要的:一个场景模型,它只通过3D旋转和3D平移(即3D坐标系的变化)与真实模型相关。因此,场景中的正交角在该模型中是正交的,场景中的1米距离对应模型中的1米距离。为了获得这样的欧几里得三维重建,需要知道至少一些相机的特性和场景中两个给定点之间的真实距离。
-
度量或相似度重建在大多数情况下都足够好,并且指的是通过相似度变换与真实模型相关的场景的3D模型,换句话说,通过3D旋转和3D平移(即3D坐标系的变化)以及总体缩放。为了获得这样的度量重建,需要知道至少一些相机的特性。
-
投影重建是你将获得的,如果你没有关于场景或相机的内在知识。这样的3D模型与观察到的场景不符合比例,并且场景中正交的角度在模型中可能不会正交。
因此,如果你想要准确的重建,了解(一些)相机的内在参数是至关重要的。