【问题标题】:Measure real size of object with Calibrated Camera opencv c++?用校准相机opencv c ++测量物体的实际尺寸?
【发布时间】:2018-05-30 04:21:28
【问题描述】:

我正在完成与 opencv 相关的论文。 我想用单台相机测量物体的真实尺寸(mm),但我有转换相机的自然单位(像素)和现实世界单位的问题!!! 校准相机后,我有:

  1. 相机矩阵(3x3)
  2. 失真系数
  3. 外参数[旋转向量(1x3) + 平移向量(1x3)]

我已阅读以下链接,但找不到转换单位的公式。 https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html

关于测量对象大小的示例

有什么建议??? 非常感谢。

【问题讨论】:

  • 但你至少需要距离对象
  • 我从相机到物体的距离是固定的。它是 450 毫米。

标签: c++ opencv


【解决方案1】:

如 cmets 中所述,您需要到对象的距离才能从像素中获取 3D 坐标。一个可能的工作流程是:

  1. 使用畸变参数对图像进行校正,即校正相机造成的畸变。
  2. 使用相机矩阵将像素解投影为相机坐标系中的 3D 点。为此,您可以将 3x3 相机矩阵的逆矩阵与包含像素 [pixel_x, pixel_y, 1]^T 的向量相乘。如果将结果 [x', y', 1]^T 乘以深度,即 z 分量,您将获得相机坐标系中的 3D 点。
  3. 使用外部参数将点从相机坐标系转换为世界坐标系。

仅从图像中获取深度值是不可能的。唯一的选择是使用一些附加信息。也许您的对象放在桌子上,并且您知道相机和桌子之间的距离。

要测量相机与桌子甚至物体本身之间的距离,您可以使用 Aruco 标记,它也可在 openCV 中使用。

【讨论】:

  • 关于 3:我有外部参数,但那是旋转向量而不是旋转矩阵,我不能不使用 cvRodrigues 将向量转换为矩阵,以便将点从相机坐标系转换到世界坐标系。我有 rvec。垫旋转矩阵(3、3、CV_64F);罗德里格斯(rvecs,rotationMatrix); cout
  • 我不明白你的问题。但如果您只对对象的大小感兴趣,则可以跳过第 3 步。
  • 我已经校准了相机,并且我用自然单位(像素)测量了物体的大小,但我想用物理单位(mm)测量物体的实际大小。又怎样?谢谢
  • 假设您的对象是一个矩形,就像在您的图片中一样,您必须使用步骤 2 将对象角的像素坐标转换为 3D 坐标(如果图像未校正,则可能是步骤 1) .对象的大小是 3D 坐标中角点之间的距离。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
  • 2014-06-19
  • 2013-02-05
  • 2021-09-29
  • 2013-01-28
  • 2014-10-23
相关资源
最近更新 更多