我已经训练了一个Yolo网络,使用在python实现的Darknet环境中运行的Yolo v3来检测道路上的对象。
我使用的是"英特尔Realsense L515"one_answers"英特尔Realsense D435i"。
如何获得检测到的物体的X、Y、Z坐标以及从相机到物体本身的距离?
非常感谢您的帮助!
基本上,您要进行的转换是投影的反向操作。我相信唯一重要的信息是你有一个深度相机和一个物体探测器产生的预测。您所拥有的信息是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]