OpenCV - 来自两个垂直2D图像的3D真实世界坐标

时间:2015-07-06 09:28:11

标签: c++ opencv 3d-reconstruction

可能有答案,但我根本不明白我发现了什么。也许这是语言障碍。所以我决定最后问。我需要的是从两个摄像机记录的两个视频中找到3D坐标。设置如下:

enter image description here

我似乎无法掌握如何做到这一点。我拥有的是

  • 两张照片上的像素坐标(相对于照片上的0,0点)
  • 焦距
  • 两个摄像机距离0,0,0真实世界点(Ax和By)的距离
  • 像素大小
  • 我知道相机之间的角度是90度

现在怎么办? OpenCV文档包含以下公式: enter image description here

我不知道是什么,也不知道[R | T]矩阵,外在参数。我不知道主要观点在哪里以及如何找到它(cx,cy)我只能假设将其设置为0不会是灾难性的。此外,这看起来只使用其中一个2D图像,而不是两者。

我知道calibrateCamerasolvePnP。和stereoCalibrate函数,但我不知道如何使用它们。

我知道当你将相机作为两只“眼睛”时会有多复杂,我希望在相机拍摄垂直图像的情况下会更容易。我现在有一个计算3D坐标的公式,但它并不完全精确。误差小于1英寸,但是太大了1英寸。

xa, ya, xb, yb - pixel coordinates from pictures
focalAB - focal length
W = -(Ax*xb*pixelSize - focalB*By)/(xa*pixelSize*xb*pixelSize - focalA*focalB)
X = Ax + W*xa*pixelSize
Y = W*focalA
Z = W*xa*pixelSize

错误:

enter image description here

这些是由制造商提供的焦距和像素大小。 5400um和1,75um。然而,对于值4620um和1,69um,误差最小,其中最大值为3#X轴,2,3cm,高度误差amost消失(最大0.2cm),其余为0,1cm或1-1.5厘米。

2 个答案:

答案 0 :(得分:0)

除了告诉你阅读@YangKui建议的立体视觉之外,我还可以回答你的一些子问题。

您引用的等式是(单相机)3D到2D投影方程。这是一个投影几何方程(因此1s作为最后一个坐标),一切都达到了某种尺度s

  • s是这个比例因子。
  • R是相机相对于世界/所选坐标系的3x3旋转。
  • t是来自世界/所选坐标系原点的相机原点的转换。
  • cxcy是图像中的主要点 - Z轴相交的像素单位中的图像平面点。它通常被认为是图像的中心。

答案 1 :(得分:0)

我发现,如果不是高性能实现,我发现一种方法就是为两个摄像机构建摄像机矩阵,然后使用非线性优化来解决M最小化"重投影误差&#34 ;。

所以想出相机矩阵:A的相机矩阵将A的世界坐标中的相机中心映射到A相机坐标中的(0,0,0)。 A相机矩阵的旋转部分将世界坐标中的(0,1,0)映射到相机坐标中的(0,0,1)。

现在您可以将世界坐标映射到A和B图像坐标,因此对于任何(x,y,z),您都有相应的4向量:(x_A,y_A,x_B,y_B)。如果你投掷点(A_x,B_y,0),你得到一个4向量。该4向量与测量位置之间的差异是您的重投影错误。把它扔在求解器上它应该很快收敛于答案。

您可以尝试在计算机视觉中使用多视图几何图形''作者:Hartley和Zisserman。