首页 > 解决方案 > 在 Yolo v3 Darknet 中测量检测到的对象的 X、Y、Z 坐标

问题描述

我已经训练了一个 Yolo 网络,以使用在 python 实现的暗网环境中运行的 Yolo v3 检测道路上的物体​​。

我正在使用英特尔 Realsense L515 和英特尔 Realsense D435i。

如何获取检测到的对象的 X、Y、Z 坐标以及相机到对象本身的距离?

非常感谢任何帮助!

标签: pythonyolodarknetrealsense

解决方案


基本上,您要进行的转换是投影的反向操作。我相信唯一重要的信息是你有一个深度相机和一个物体检测器产生的预测。您拥有的信息是 UV 坐标(在图像平面中)和深度(Z 坐标)。并且您想将 UVZ(像素坐标)转换为 XYZ(世界坐标)。注意 Z 在转换过程中不会改变。通用 Z 坐标允许您执行转换。

转换基于针孔相机模型https://en.wikipedia.org/wiki/Pinhole_camera_model。您需要知道捕获图像的相机的内在参数。这些参数是焦距f和主点。

您可能还想访问https://en.wikipedia.org/wiki/Camera_resectioning。您将在那里找到如何使用从焦距和主点创建的投影矩阵进行此转换。请注意,它们描述了从世界到像素坐标的投影。您需要计算逆投影矩阵来进行像素到世界的转换。

我还在 Tensorflow 中包含了一个使用投影矩阵的示例。

self.intrinsic_matrix = tf.constant([[self.focal_length[0], 0, self.principal_point[0], 0],
                                     [0, self.focal_length[1], self.principal_point[1], 0],
                                     [0, 0, 1, 0],
                                     [0, 0, 0, 1]], dtype=tf.float32)
self.invr_projection_matrix = tf.linalg.inv(self.projection_matrix)

multiplied_uv = points_uvz[..., 0:2] * points_uvz[..., 2:3]
ones = tf.ones([points_uvz.shape[0], points_uvz.shape[1], 1], dtype=points_uvz.dtype)
multiplied_uvz1 = tf.concat([multiplied_uv, points_uvz[..., 2:3], ones], axis=-1)
tranposed_xyz = tf.matmul(self.invr_projection_matrix, multiplied_uvz1, transpose_b=True)
xyz = tf.transpose(tranposed_xyz, [0, 2, 1])[..., :3]

推荐阅读