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

深度图转换为点云文件脚本

步骤

1. 读取深度图像

  • 使用OpenCV读取16位深度图(假设输入是单通道的深度图,单位为毫米)。

  • cv2.IMREAD_UNCHANGED 确保保留原始数据精度(如16位)。

2. 相机内参设置

  • 内参被除以4,因为深度图的分辨率被缩小了4倍(如从高分辨率下采样到当前尺寸)。

  • 注意:如果图像未缩放,此操作会导致坐标计算错误。

3. 遍历像素生成点云

  • 坐标转换公式:将像素坐标 (u, v) 转换为相机坐标系下的3D点 (x, y, z)

  • 公式依据:根据相机模型,三维点 P(x, y, z)到像素坐标P_s的转换,如图所示:

转换公式为焦距放缩加上坐标系中心主点偏移:

u=f_x\frac{X}{Z}+c_x,v=f_y\frac{Y}{Z}+c_y

则反推为:

X=\frac{u-c_x}{f_x}Z,Y=\frac{v-c_y}{f_y}Z

4. 坐标轴变换与单位转换

  • 坐标轴重排:将相机坐标系的 (z, x, y) 转换为点云的 (x, y, z),可能意图调整坐标系朝向。

  • 单位转换:假设深度图单位为毫米,除以1000转换为米(常见于Kinect等设备)。

5. 生成并保存点云

代码实现

import cv2
import numpy as np
import open3d as o3ddepth_image = cv2.imread('C:/pyprojects/images/1112_0-rgb.png', cv2.IMREAD_UNCHANGED)if depth_image is None:print("fail")exit()# 相机内参(根据你的相机设置进行调整)
fx = 1085.76 # 焦距 x
fy = 1085.93  # 焦距 y
cx = 600.785  # 主点 x
cy = 496.776  # 主点 yheight, width = depth_image.shape
print("depth_image.shape  ", depth_image.shape)
points = []
for v in range(height):for u in range(width):z = depth_image[v, u]  # 获取深度值if z > 0:  # 过滤无效点x = (u - (cx/4)) * z / (fx/4)  y = (v - (cy/4)) * z / (fy/4)point_x = z / 1000.0point_y = x / 1000.0point_z = y / 1000.0# point_x = z # point_y = x # point_z = y points.append([point_x, point_y, point_z])points = np.array(points)
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)
print("点云数量:", len(pcd.points))# o3d.visualization.draw_geometries([pcd])o3d.io.write_point_cloud("C:/pyprojects/depth_init.pcd", pcd)

初始深度图(已可视化):

点云展示(使用CloudCompare v2.13打开):

http://www.xdnf.cn/news/7931.html

相关文章:

  • 2025-05-21 Python深度学习5——数据读取
  • 深入解析应用程序分层及 BaseDao 的封装策略
  • Electron 后台常驻服务实现(托盘 + 开机自启)
  • 第18天-NumPy + Pandas + Matplotlib多维度直方图
  • HashMap 两数之和java
  • 【最细】自动化测试-解决日志问题,一文贯通...
  • 深入浅出IIC协议 - 从总线原理到FPGA实战开发 --第四篇:I2C工业级优化实践
  • 2024CCPC辽宁省赛 个人补题 ABCEGJL
  • Plant Cell|澳大利亚国立大学研究团队揭示狗尾草应对长期高温的 “生存秘籍”-三重协同机制逆天改命!
  • 46页 @《人工智能生命体 新启点》中國龍 原创连载
  • fatload使用方式
  • 解锁 YOLOv8 新潜能:EfficientViT 主干网络的优化实践与实验数据解读
  • 【spring】spring学习系列之十一:spring的事件监听
  • uni.getLocation()和uni.openSetting()
  • SOC-ESP32S3部分:5-IDF的日志管理
  • LVDS系列13:Xilinx Ultrascale系可编程输入延迟(三)
  • STM32之串口通信WIFI上云
  • Centos8安装 python3并保留系统的python2
  • C语言求1到n的和(附带源码和解析)
  • 华为云Flexus+DeepSeek征文|零基础搭建Dify-LLM应用开发平台 - 从部署到应用的完整指南
  • 关于光谱相机的灵敏度
  • C++学习之类和对象_2
  • 【web全栈】若依框架B站学习视频
  • 面向高温工业场景的EtherCAT/CANopen协议转换系统设计与应用
  • 互联网大厂Java求职面试:Spring Cloud微服务架构与AI集成挑战
  • Redis从入门到实战 - 高级篇(下)
  • Linux锁和互斥锁
  • 机器学习之随机森林(五)
  • Unity ​​MeshCollider 无法被射线检测到
  • TCP网络编程学习