如何获得从我的相机到 OpenCV ArUco 标记的距离
How can I get the distance from my camera to an OpenCV ArUco Marker
我如何使用 OpenCV 的 ArUco 框架来获取从相机到 ArUco 标记的距离?
需要几个步骤才能获得从您的相机到 ArUco 标记的距离。
校准相机
这一步是最重要的。如果您跳过这一步,进一步描述的步骤中的所有结果都将不准确。
您要使用的相机需要校准。重要的是,您在此步骤中使用相机的方式与将其用于标记检测的方式完全相同。所以相同的分辨率,焦距(相同的镜头)。
那里有很多很好的指南,因此我将跳过此任务以专注于主要问题。
可能的指南:
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 标记的距离
这一步需要参数来纠正上一步的失真。我将在进一步的示例中调用 cameraMatrix mtx
和 distCoeffs dist
。
- 确保调整 ArUco 检测所需的所有参数。
我不会解释简单标记检测需要什么,因为那里有很多好的指南。
dictionary = cv.aruco.Dictionary_get(cv.aruco.DICT_4X4_50)
parameters = cv.aruco.DetectorParameters_create()
- 在您的相框上搜索制造商
frame
将是包含标记
的框架
(corners, ids, rejected) = cv.aruco.detectMarkers(frame, dictionary, parameters=parameters)
- 估计标记的姿势
您将需要要查找的标记的大小。所以在纸上打印的实际尺寸。测量它,因为我们将需要它。使用什么测量单位并不重要。但请注意,我们将收到的距离结果将是相同的单位。我在这个例子中使用了 CM
markerSizeInCM = 15.9
rvec , tvec, _ = aruco.estimatePoseSingleMarkers(corners, markerSizeInCM, mtx, dist)
- 读出距离
我们现在有了标记 (rvec
) 相对于相机的旋转矢量和平移矢量 (tvec
)。查看来源:OpenCV
平移向量与我们在步骤 3 中提供的真实标记大小的单位相同。格式为 [x,y,z]
,即标记在 3D space 中的位置。
我们现在只需要从 tvec
中读出 z
,这将是我们在步骤 3 中提供的相同测量单位中从我们的相机到标记中心的距离。
我如何使用 OpenCV 的 ArUco 框架来获取从相机到 ArUco 标记的距离?
需要几个步骤才能获得从您的相机到 ArUco 标记的距离。
校准相机
这一步是最重要的。如果您跳过这一步,进一步描述的步骤中的所有结果都将不准确。
您要使用的相机需要校准。重要的是,您在此步骤中使用相机的方式与将其用于标记检测的方式完全相同。所以相同的分辨率,焦距(相同的镜头)。
那里有很多很好的指南,因此我将跳过此任务以专注于主要问题。 可能的指南: 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 标记的距离
这一步需要参数来纠正上一步的失真。我将在进一步的示例中调用 cameraMatrix mtx
和 distCoeffs dist
。
- 确保调整 ArUco 检测所需的所有参数。
我不会解释简单标记检测需要什么,因为那里有很多好的指南。
dictionary = cv.aruco.Dictionary_get(cv.aruco.DICT_4X4_50)
parameters = cv.aruco.DetectorParameters_create()
- 在您的相框上搜索制造商
frame
将是包含标记
(corners, ids, rejected) = cv.aruco.detectMarkers(frame, dictionary, parameters=parameters)
- 估计标记的姿势
您将需要要查找的标记的大小。所以在纸上打印的实际尺寸。测量它,因为我们将需要它。使用什么测量单位并不重要。但请注意,我们将收到的距离结果将是相同的单位。我在这个例子中使用了 CM
markerSizeInCM = 15.9
rvec , tvec, _ = aruco.estimatePoseSingleMarkers(corners, markerSizeInCM, mtx, dist)
- 读出距离
我们现在有了标记 (rvec
) 相对于相机的旋转矢量和平移矢量 (tvec
)。查看来源:OpenCV
平移向量与我们在步骤 3 中提供的真实标记大小的单位相同。格式为 [x,y,z]
,即标记在 3D space 中的位置。
我们现在只需要从 tvec
中读出 z
,这将是我们在步骤 3 中提供的相同测量单位中从我们的相机到标记中心的距离。