点云数据深度图与点云转换(二)

一、根据深度图数据生成点云

深度图转为点云说白了其实就是坐标系的变换:图像坐标系转换为世界坐标系。变换的约束条件就是相机内参。其中x,y,z是点云坐标系,x’,y’是图像坐标系,D为深度值。
在这里插入图片描述

import numpy as np

CAM_WID,CAM_HGT = 640,480           # 重投影到的深度图尺寸
CAM_FX,CAM_FY   = 795.209,793.957   # fx/fy
CAM_CX,CAM_CY   = 332.031,231.308   # cx/cy

EPS=1.0e-16

# 加载点云数据
pc=np.genfromtxt('pc_rot.csv', delimiter=',').astype(np.float32)

# 滤除镜头后方的点
valid=pc[:,2]>EPS
z=pc[valid,2]
        
# 点云反向映射到像素坐标位置
u=np.round(pc[valid,0]*CAM_FX/z+CAM_CX).astype(int)
v=np.round(pc[valid,1]*CAM_FY/z+CAM_CY).astype(int)
    
# 滤除超出图像尺寸的无效像素
valid=np.bitwise_and(np.bitwise_and((u>=0),(u<CAM_WID)),
                     np.bitwise_and((v>=0),(v<CAM_HGT)))
u,v,z=u[valid],v[valid],z[valid]

# 按距离填充生成深度图,近距离覆盖远距离
img_z=np.full((CAM_HGT, CAM_WID),np.inf)        
for ui,vi,zi in zip(u,v,z):
    img_z[vi,ui]=min(img_z[vi,ui],zi)   # 近距离像素屏蔽远距离像素

# 小洞和“透射”消除
img_z_shift=np.array([img_z,\
                      np.roll(img_z, 1,axis=0),\
                      np.roll(img_z,-1,axis=0),\
                      np.roll(img_z, 1,axis=1),\
                      np.roll(img_z,-1,axis=1)])
img_z=np.min(img_z_shift,axis=0)

# 保存重新投影生成的深度图dep_rot
np.savetxt('dep_rot.csv',img_z,fmt='%.12f',delimiter=',',newline='\n')

# 加载刚保存的深度图dep_rot并显示
import matplotlib.pyplot as plt
img=np.genfromtxt('dep_rot.csv', delimiter=',').astype(np.float32)
plt.imshow(img,cmap='jet')
plt.show()

二、点云重新投影生成深度图

import numpy as np

# 加载数据
img=np.genfromtxt('dep640x480.csv', delimiter=',').astype(np.float32)

# 参数
CAM_WID,CAM_HGT = 640,480        
CAM_FX,CAM_FY   = 795.209,793.957
CAM_CX,CAM_CY   = 332.031,231.308

# 转换
x,y=np.meshgrid(range(CAM_WID),range(CAM_HGT))
x=x.astype(np.float32)-CAM_CX
y=y.astype(np.float32)-CAM_CY

img_z=img.copy()
if False:   # 如果需要矫正视线到Z的转换的话使能
    f=(CAM_FX+CAM_FY)/2.0
    img_z*=f/np.sqrt(x**2+y**2+f**2)
    
pc_x=img_z*x/CAM_FX     #   X=Z*(u-cx)/fx
pc_y=img_z*y/CAM_FY     #   Y=Z*(v-cy)/fy

pc=np.array([pc_x.ravel(),pc_y.ravel(),img_z.ravel()]).T

# 结果保存
np.savetxt('pc.csv', pc, fmt='%.18e', delimiter=',', newline='\n')

# 从CSV文件加载点云并显示
pc=np.genfromtxt('pc.csv', delimiter=',').astype(np.float32)

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

ax = plt.figure(1).gca(projection='3d')
ax.plot(pc[:,0],pc[:,1],pc[:,2],'k.',markersize=0.05)
plt.title('point cloud')
plt.show()    

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将Python中的三维点数据(PLY格式)转换深度像,可以按照以下步骤进行操作: 1. 导入必要的库:在Python中,可以使用一些库来处理三维点数据像处理,如NumPy、open3d和PIL等。使用命令`pip install numpy open3d pillow`来安装这些库。 2. 加载点数据:使用open3d库中的`read_point_cloud`函数来加载PLY文件中的三维点数据。 3. 将点数据转换深度像:根据点数据,可以计算出每个像素点的深度值。可以通过遍历点数据的每个点,使用三维坐标转换为二维像坐标,并将对应像素点的值设置为该点的深度值。 4. 创建深度像:使用PIL库来创建空白的像对象,并设置像大小和模式(如灰度像)。 5. 填充深度像:根据转换后的深度值,将每个像素点的值填充到深度像中。 6. 保存深度像:使用PIL库中的`save`函数将深度像保存为指定格式的像文件(如PNG格式)。 以下是一个简单的示例代码,演示如何将PLY格式的三维点数据转换深度像: ```python import numpy as np import open3d as o3d from PIL import Image # Step 1: 加载点数据 point_cloud = o3d.io.read_point_cloud("input.ply") # Step 2: 将点数据转换深度像 depth_image = np.zeros((height, width)) # 二维像的大小与点数据的高度和宽度相关 for p in point_cloud.points: x, y, z = p x_pixel = int(x * fx / z + cx) y_pixel = int(y * fy / z + cy) depth_image[y_pixel, x_pixel] = z # Step 3: 创建深度像 depth_image_pil = Image.fromarray(depth_image.astype(np.uint16)) # Step 4:保存深度像 depth_image_pil.save("depth_image.png") ``` 需要注意的是,上述代码中的`fx`、`fy`、`cx`和`cy`是相机的内参,需要根据具体的相机参数进行设置。此外,还需要根据点数据的实际情况,对像的大小进行适当设置,以保证转换后的深度像具有正确的尺寸。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值