You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何将.ply点云深度叠加到.bmp文件并导出为.jpg格式?

TOF点云深度叠加到BMP图像的Python实现流程

这里优先推荐plyfile + OpenCV + NumPy的方案,兼容性远好于python-pcl和Open3D,无需处理编译依赖,可直接在Google Colab环境运行,具体操作如下:

1 环境安装

Colab终端执行以下命令安装依赖:
!pip install plyfile opencv-python numpy

2 核心操作步骤

2.1 数据加载

  • 读取BMP原图:用OpenCV读取后转换为RGB格式,避免颜色通道错乱
  • 读取PLY点云:提取点云的X、Y、Z三维坐标,Z值即为对应点的深度数据

注:需确保你的点云与BMP图像已经完成配准,或持有TOF相机的内参矩阵用于后续投影转换

2.2 点云投影到图像平面

如果点云已对齐到图像坐标系:直接将点云的X、Y值映射为图像的像素坐标,过滤掉超出图像宽高范围的无效点。
如果未配准:用相机内参矩阵对三维点做投影计算,得到对应的像素坐标,公式如下:
像素u = fx * X / Z + cx
像素v = fy * Y / Z + cy
其中fx、fy为相机焦距,cx、cy为图像主点坐标,均为TOF相机出厂内置参数。

2.3 深度叠加可视化

  • 将有效点的深度值做归一化处理,映射到0-255的数值范围
  • 用OpenCV的applyColorMap函数将归一化后的深度值转换为伪彩色图像
  • 将伪彩色深度图与原BMP图像按权重融合,推荐原图权重0.7、深度图权重0.3,兼顾原图内容和深度信息的可读性

2.4 导出结果

将融合后的图像转换为BGR格式,用cv2.imwrite直接导出为jpg格式文件即可。

3 示例代码

import cv2
import numpy as np
from plyfile import PlyData

# 1. 加载数据
bmp_img = cv2.imread("your_image.bmp")
bmp_rgb = cv2.cvtColor(bmp_img, cv2.COLOR_BGR2RGB)
h, w = bmp_rgb.shape[:2]

ply_data = PlyData.read("your_point_cloud.ply")
x = ply_data['vertex']['x']
y = ply_data['vertex']['y']
z = ply_data['vertex']['z']

# 2. 点云投影(这里用已配准的情况示例)
u = np.round(x).astype(int)
v = np.round(y).astype(int)
valid = (u >= 0) & (u < w) & (v >= 0) & (v < h) & (z > 0)
u_valid = u[valid]
v_valid = v[valid]
z_valid = z[valid]

# 3. 深度叠加
depth_norm = cv2.normalize(z_valid, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U)
depth_color = cv2.applyColorMap(depth_norm, cv2.COLORMAP_JET)
fusion_img = bmp_rgb.copy()
for i in range(len(u_valid)):
    fusion_img[v_valid[i], u_valid[i]] = cv2.addWeighted(fusion_img[v_valid[i], u_valid[i]], 0.7, depth_color[i], 0.3, 0)

# 4. 导出jpg
fusion_img_bgr = cv2.cvtColor(fusion_img, cv2.COLOR_RGB2BGR)
cv2.imwrite("fusion_result.jpg", fusion_img_bgr)

4 python-pcl实现方案

如果必须使用python-pcl,仅需修改点云加载部分的逻辑即可,投影和叠加逻辑与上述代码完全一致:

  • Colab安装python-pcl命令:!apt-get install libpcl-dev -y && pip install python-pcl
  • 点云加载代码:
import pcl
cloud = pcl.load("your_point_cloud.ply")
points = np.asarray(cloud)
x = points[:, 0]
y = points[:, 1]
z = points[:, 2]

内容的提问来源于stack exchange,提问作者Sabbir Talukdar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:45:00