当前位置: 首页 > news >正文

3d bounding box投影到2d

写在前面

  • 本文内容
    使用内参和相机pose将3d bounding box投影到2d
    在这里插入图片描述

  • 平台/环境
    python, open3d, opencv

  • 转载请注明出处:
    https

    目录

    • 写在前面
    • 代码

代码


def project_box_to_2d2(bbox_3d, camera_pose, camera_intrinsics, width, height, image = None):"""投影3D边界框到2D图像平面Args:bbox_3d (o3d.geometry.AxisAlignedBoundingBox 或 o3d.geometry.OrientedBoundingBox): 3D边界框camera_pose (np.ndarray): 相机位姿矩阵 (4x4)camera_intrinsics (np.ndarray): 相机内参矩阵 (3x3)width (int): 图像宽度height (int): 图像高度image (np.ndarray, optional): 要绘制边界框的图像. Defaults to None."""# 获取边界框的最小和最大点min_bound = bbox_3d.get_min_bound()max_bound = bbox_3d.get_max_bound()# print("Min Bound:", min_bound)# print("Max Bound:", max_bound)# 3D空间中边界框的8个顶点bbox_points = np.array([[min_bound[0], min_bound[1], min_bound[2]],[max_bound[0], min_bound[1], min_bound[2]],[max_bound[0], max_bound[1], min_bound[2]],[min_bound[0], max_bound[1], min_bound[2]],[min_bound[0], min_bound[1], max_bound[2]],[max_bound[0], min_bound[1], max_bound[2]],[max_bound[0], max_bound[1], max_bound[2]],[min_bound[0], max_bound[1], max_bound[2]],])# 将3D点转换为齐次坐标bbox_points_homogeneous = np.hstack((bbox_points, np.ones((bbox_points.shape[0], 1))))bbox_points_camera = np.dot(np.linalg.inv(camera_pose), bbox_points_homogeneous.T).T# 通过相机内参矩阵将3D点投影到图像平面bbox_points_2d = np.dot(camera_intrinsics, bbox_points_camera[:, :3].T).Tbbox_points_2d = bbox_points_2d[:, :2] / bbox_points_2d[:, 2:]# 2D边界框的顶点lines = [(0, 1),(1, 2),(2, 3),(3, 0),  # 底部(4, 5),(5, 6),(6, 7),(7, 4),  # 顶部(0, 4),(1, 5),(2, 6),(3, 7),  # 连接顶部和底部]# 选择x和y的最小值和最大值作为2D边界框,并将边界限制在图像内x_min = int(np.clip(np.min(bbox_points_2d[:, 0]), 0, width - 1))x_max = int(np.clip(np.max(bbox_points_2d[:, 0]), 0, width - 1))y_min = int(np.clip(np.min(bbox_points_2d[:, 1]), 0, height - 1))y_max = int(np.clip(np.max(bbox_points_2d[:, 1]), 0, height - 1))bbox_2d = np.array([x_min, y_min, x_max, y_max])image_show = copy.deepcopy(image)if image_show is not None:# 在图像上绘制投影的3D边界框for line in lines:pt1 = tuple(bbox_points_2d[line[0]].astype(int))pt2 = tuple(bbox_points_2d[line[1]].astype(int))cv2.line(image_show, pt1, pt2, (0, 255, 0), 2)# 绘制2D边界框print("2D Bounding Box:", bbox_2d)cv2.rectangle(image_show, (x_min, y_min), (x_max, y_max), (0, 0, 255), 2)# 可视化cv2.namedWindow("Projected 3D Bounding Box", cv2.WINDOW_NORMAL)cv2.imshow("Projected 3D Bounding Box", image_show)cv2.waitKey(0)cv2.destroyAllWindows()return bbox_2d, image_show

主要做激光/影像三维重建,配准、分割等常用点云算法,熟悉open3d、pcl等开源点云库,技术交流、咨询可私信

http://www.dtcms.com/a/278175.html

相关文章:

  • 12中kali自带的网络工具(开箱即用)
  • 一文打通MySQL任督二脉(事务、索引、锁、SQL优化、分库分表)
  • OSPF与BGP的联动特性实验案例
  • ConcurrentHashMap笔记
  • 从零开始学习深度学习—水果分类之PyQt5App
  • AutoDL挂载阿里云OSS
  • leetGPU解题笔记(1)
  • 【LeetCode Hot100 | 每日刷题】字母异位词分组
  • Can I Trust Your Answer? Visually Grounded Video Question Answering
  • C++高频知识点(十三)
  • 删除screen会话以及查看进程信息的方法
  • 魔力宝贝归来版,虚拟机搭建教程
  • 【SCI 4区推荐】《Journal of Visual Communication and Image Representation》
  • 消息中间件优化高手笔记
  • 退出登录后头像还在?这个缓存问题坑过多少前端!
  • 论文阅读:PolarFree Polarization-based Reflection-Free Imaging
  • IT岗位任职资格体系及发展通道-产品经理岗位任职标准参考
  • 《Python JSON 数据解析全指南:从基础到实战(含 jsonpath 与 Schema 验证)》
  • 九、官方人格提示词汇总(上)
  • 改进广告投入与销售额预测分析
  • CVE-2021-31201
  • 特征选择要解决什么问题
  • 算法题(174):全排列问题
  • 碳水循环(增肌、减脂)
  • AEC原理
  • 白盒测试方法深度解析:从理论到实践
  • Python协程进阶:优雅终止与异常处理详解
  • Mybatis 两级缓存可能导致的问题
  • 「小程序开发」新建页面设置启动页
  • alpinelinux的包管理