【问题标题】:Find 3D coordinate with respect to the camera using 2D image coordinates使用 2D 图像坐标查找相对于相机的 3D 坐标
【发布时间】:2020-09-14 16:53:24
【问题描述】:

我需要使用 2D 图像中的 u,v 坐标计算世界中相对于相机的 X,Y 坐标。我正在使用 S7 边缘摄像头向 MATLAB 发送 720x480 视频源。

我所知道的:Z,即相机的物体深度、相机像素的大小(1.4um)、焦距(4.2mm)

假设图像点位于 (u,v) = (400,400)。

我的做法如下:

  1. 从图像中点的 u,v 像素坐标中减去中心点 (240,360) 的像素值。这应该为我们提供相对于相机光轴(z 轴)的像素坐标。原点现在位于图像的中心。所以新坐标是:(160, -40)
  2. 将新的 u,v 像素值与像素大小相乘,以物理单位获得点到原点的距离。我们称之为 (x,y)。我们得到 (x,y) = (0.224,-0.056) 以毫米为单位。
  3. 使用公式 X = xZ/f & Y = yZ/f 计算现实世界中相对于相机光轴的 X、Y 坐标。

我的方法正确吗?

【问题讨论】:

    标签: matlab image-processing robotics coordinate-systems


    【解决方案1】:

    您的方法是正确的,但如果您使用更标准化的方法会更容易。我们通常做的是使用Pinhole Camera Model 为您提供世界坐标[X, Y, Z] 到像素[x, y] 之间的转换。查看this guide,它逐步描述了构建转换的过程。

    基本上你必须定义你的内部相机矩阵来进行转换:

    • fx 和 fy 是缩放后用作像素距离的焦距。您可以使用您的 FOV 和每个方向的总像素来计算它。查看herehere 了解更多信息。
    • u0 和 v0 是穿刺点。由于我们的像素不在[0, 0] 中居中,因此这些参数表示到图像中心的平移。 (光轴与像素坐标中提供的图像平面的交点)。

    • 如果需要,您还可以添加 偏斜系数 a,您可以使用它来校正相机的剪切效应。然后,内部相机矩阵将是:

    由于您的深度是固定的,只需修复您的 Z 并继续转换就不会出现问题。

    记住:如果您想要逆变换(相机到世界),只需反转您的相机矩阵即可!

    Matlab has also a very good guide for this transformation. Take a look.

    【讨论】:

    • 嘿@Leonardo Mariga,我按照 MATLAB 教程进行相机校准。它给了我内在的相机矩阵。我不确定如何执行您建议的相机矩阵的反转。完整的相机模型还涉及相机的外在矩阵。通过 matlab 使用校准计算的外在矩阵与我使用的棋盘格相关,对吗?我如何知道不同应用程序的外在矩阵?我正在尝试检测门把手,并使用旋钮的质心(以像素为单位),根据相机的旋钮深度计算其在现实世界中的位置
    • 使用内在矩阵中提供的以像素为单位的焦距,我使用以下两个等式来查找现实世界中的 X、Y 值。 x = (u - cx) * z / fx & y = (v - cv) * z / fy 其中 u,v 是旋钮质心的像素坐标,cx,cv 是图像的中心点,z 是相机的深度lens to doorknob in mm, fx, fy 是以像素为单位的焦距,由内在矩阵给出。结果在 y 方向上相差约 100 毫米,在 x 方向上相差 50 毫米
    • 关于逆矩阵,您可以排除最后一列,对 3x3 结果矩阵求逆。看看here。是的,它与棋盘有关。对于其他应用程序,您可以校准新相机并通过其他方式获得相机的旋转和平移(例如 ARUCO)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 2011-02-02
    • 2018-07-07
    相关资源
    最近更新 更多