Opencv 真实尺度的三维重建

Opencv 真实尺度的三维重建,opencv,computer-vision,camera-calibration,3d-reconstruction,Opencv,Computer Vision,Camera Calibration,3d Reconstruction,我正在做一个项目来检测物体的三维位置。我在房间的两个角落安装了两个摄像头,我已经获得了它们之间的基本矩阵。这些相机是内部校准的。我的图像是2592x1944 K=[1228 0 3267 0 1221 538 01] F=[-1.098e-7 3.50715e-7-0.000313 2.312e-7 2.72256e-7 4.629e-5 0.000234-0.00129250 1] 现在,我如何继续,以便给定空间中的一个3D点,我应该能够在图像上获得对应于房间中相同对象的点。如果我

我正在做一个项目来检测物体的三维位置。我在房间的两个角落安装了两个摄像头,我已经获得了它们之间的基本矩阵。这些相机是内部校准的。我的图像是2592x1944

K=[1228 0 3267 0 1221 538 01]

F=[-1.098e-7 3.50715e-7-0.000313 2.312e-7 2.72256e-7 4.629e-5 0.000234-0.00129250 1]

现在,我如何继续,以便给定空间中的一个3D点,我应该能够在图像上获得对应于房间中相同对象的点。如果我可以获得正确的投影矩阵(具有正确的比例),我可以稍后使用它们作为OpenCV的traingulatePoints函数的输入,以获得对象的位置

很久以来我一直在做这个。所以,请帮帮我


谢谢。

可能会更简单地使用功能吗?它将为您提供三维坐标。

根据我收集的信息,您通过某种校准方法获得了基本矩阵?无论哪种方式,使用基本矩阵(或校准装备本身),您都可以通过分解基本矩阵来获得姿势差。一旦你有了这些,你可以使用匹配的特征点(使用特征提取器和描述符,如SURF,BRISK,…)来识别一幅图像中的哪些点与另一幅图像中的另一个特征点属于同一个对象点。
有了这些信息,你就可以用三角网来定位了。

很抱歉,评论的篇幅不够大。。 所以@user2167617回复你的评论。
差不多。不过有几个指针:奇异值应该是(s,s,0),所以(1.3,1.05,0)是一个很好的猜测。关于R:从技术上讲,这是正确的,但是,忽略标志。很可能得到一个旋转矩阵,它不满足约束确定性(R)=1,而是-1。在这种情况下,您可能需要将其与-1相乘。通常,如果您在这种方法中遇到问题,请尝试使用5点算法确定基本矩阵(在最新版本的OpenCV中实现,您必须自己构建)。用这些信息确实不可能获得比例。然而,这一切都取决于规模。例如,如果您将摄像机之间的距离定义为1个单位,则所有内容都将以该单位进行测量。

我主要关心的是获取投影矩阵P1和P2。我知道在基本矩阵F的帮助下,我只能得到标准投影矩阵,但它们并没有达到实际的规模。请您指导我如何获得P1和P2,它们对真实比例有好处。这是关于3D重建的讲座(),还有“重建模糊性”一章告诉我们不能从两个视图计算比例。因此,从基本矩阵,我使用E=K2'FK1计算基本矩阵。然后,我的SVD需要一个对角矩阵,比如(s,s,1),但我的对角矩阵是diag(1.3,1.05,0)。我假设它足够好,然后使用T=U和R的最后一列可以是UDV'或U*D'*V'来查找翻译。如果我找出这些组合中的哪一个是正确的,那么P1=[i | 0]和P2=[R | T]。所以,我读到这个比例是一个无法确定的模糊性。我需要知道比例,因为我试图估算物体的精确三维坐标。我的方向正确吗?您可以强制执行此约束,即奇异值分解的对角矩阵是
diag(1,1,0)
,即,如果基本矩阵的奇异值是
e=U*D*V'
,您可以将正确的基本矩阵
e'
设置为
e'=U*diag(1,1,0)*V'
,如步骤3所示。感谢您的回复。我发现旋转和平移矩阵假设z从摄影机中心指向场景。然后,我在匹配点上使用三角形点。当我在真实场景中找到两点之间的距离,并将其与三角化图像中相同点之间的距离进行比较时,就有可能找到比例。用这种方法得到的距离有一点误差。我想这是因为我在没有进行图像校正的情况下进行了简单的线性三角测量。我希望我能通过更好的三角测量得到好的结果。如果这样做了,那就不要通过接受一个答案来结束问题。如果你的相机校准矩阵是用rowise编写的,即在Matlab符号中,
K=[1228 0 3267;0 1221 538;0 0 1]
,我认为这很尴尬。您的图像大小为
2592 x 1944
,相机校准的主要点通常位于图像中点附近的位置
(3267538)
。我认为你的相机校准不正确。。。