首页 > 解决方案 > 如何获得从我的相机到 OpenCV ArUco Marker 的距离

问题描述

如何使用 OpenCV 的 ArUco 框架来获取相机到 ArUco 标记的距离?

标签: pythonopencvaruco

解决方案


要获得从相机到 ArUco Marker 的距离,需要几个步骤。

校准相机

这一步是最重要的。如果您跳过此步骤,则进一步描述的步骤中的所有结果都将不准确。

您将使用的相机需要校准。重要的是,您在此步骤中使用相机的方式与将其用于标记检测的方式完全相同。所以相同的分辨率,焦距(相同的镜头)。

那里有很多很好的指南,因此我将跳过此任务以专注于主要问题。可能的指南: https ://docs.opencv.org/master/da/d13/tutorial_aruco_calibration.html https://mecaruco2.readthedocs.io/en/latest/notebooks_rst/Aruco/Projet+calibration-Paul.html

接收相机到 ArUco 标记的距离

这一步需要参数来纠正上一步的失真。在进一步的示例中,我将调用 cameraMatrixmtx和 distCoeffs dist

  1. 确保调整 ArUco 检测所需的所有参数。

我不会解释简单的标记检测需要什么,因为那里有很多很好的指南。

dictionary = cv.aruco.Dictionary_get(cv.aruco.DICT_4X4_50)
parameters = cv.aruco.DetectorParameters_create()
  1. 在您的框架上搜索制造商

frame将是包含标记的框架

(corners, ids, rejected) = cv.aruco.detectMarkers(frame, dictionary, parameters=parameters)
  1. 估计标记的姿势

您将需要要查找的标记的大小。所以在纸上打印了它的实际尺寸。测量它,因为我们将需要它。您将使用什么测量单位并不重要。但请注意,由于我们将收到的距离将是相同的单位。我在这个例子中使用了 CM

markerSizeInCM = 15.9
rvec , tvec, _ = aruco.estimatePoseSingleMarkers(corners, markerSizeInCM, mtx, dist)
  1. 读出距离

我们现在有了标记 ( rvec) 相对于相机的旋转向量和平移向量 ( tvec)。见源:OpenCV

平移向量的单位与我们在步骤 3 中提供的实际标记大小相同。格式[x,y,z]为标记在 3D 空间中的位置。

我们现在只需要在我们在步骤 3 中提供的相同测量单位中读取ztvec相机到标记中心的距离。


推荐阅读