python - 在 Yolo v3 Darknet 中测量检测到的对象的 X、Y、Z 坐标
问题描述
我已经训练了一个 Yolo 网络,以使用在 python 实现的暗网环境中运行的 Yolo v3 检测道路上的物体。
我正在使用英特尔 Realsense L515 和英特尔 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]
推荐阅读
- c# - 如何在 C# 中使用 Selenium 在 aria-hidden=“true” 的元素上发送密钥
- javascript - 什么!!在 JS 中做什么?
- rest - IErrorHandler 中的响应内容类型错误
- matlab - 如何使用for循环(matlab)对n个数字(pcolor)进行子图绘制
- database - 熊猫的意思是相同的元素
- javascript - 页面加载后获取 URL 的内容
- environment-variables - 如何在生产应用程序中处理配置值
- c# - 在 IQueryable 上应用内部表达式过滤器
- sql-server - 使用表中的示例数据克隆数据库
- node.js - 如何使用 nginx 将特定路径重定向到不同的文件夹