繁体   English   中英

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

[英]OpenCV - 3D real world coordinates from two perpendicular 2D images

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

在此处输入图片说明

我似乎无法掌握如何执行此操作。 我有的是

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

现在怎么办? OpenCV文档包含以下公式: 在此处输入图片说明

我不知道什么是“ s”,也不知道[R | T]矩阵的外部参数。 我不知道主要点在哪里以及如何找到它(cx,cy),我只能假设将其设置为0不会造成灾难性的后果。 同样,这看起来像是仅使用2D图像之一,而不是全部使用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

错误:

在此处输入图片说明

这些用于制造商提供的焦距和像素大小。 5400um和1,75um。 但是,对于4620um和1,69um而言,误差是最小的,其中最大误差是3#X轴,即2.3cm,高度误差几乎消失了(最大0.2cm),其余均为0.1cm。或1-1,5厘米。

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

您引用的方程式是(单个摄像机)3D到2D投影方程式。 这是一个射影几何方程式(因此将1s作为最后一个坐标),并且所有事物都达到一定比例s

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

我发现一种方法可以提供直觉(如果不是高性能的实现),那就是为两个摄像机构造摄像机矩阵,然后使用非线性优化来求解M “重投影误差”最小化。

因此,提出摄影机矩阵: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的“计算机视觉中的多视图几何”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM