文章目录
1. 三维点云基础概念
点云(Point Cloud)
点云是三维空间中点的集合,每个点包含三维坐标(x,y,z),可能还包含颜色信息(RGB)、法向量、强度等属性。它是三维重建、识别和测量的基础数据结构。
深度图像(Depth Image)
深度图像是每个像素值表示该点到相机距离的二维图像,是生成点云的重要数据源。通过相机内参可以将深度图像转换为三维点云。
import cv2
import numpy as np
import open3d as o3d
from pcl import PointCloud
# 从深度相机获取深度图
depth_image = cv2.imread('depth.png', cv2.IMREAD_UNCHANGED)
# 相机内参
fx, fy = 525.0, 525.0
cx, cy = 319.5, 239.5
# 将深度图转换为点云
def depth_to_pointcloud(depth_img, fx, fy, cx, cy):
h, w = depth_img.shape
points = []
for v in range(h):
for u in range(w):
z = depth_img[v, u]
if z > 0: # 有效深度值
x = (u - cx) * z / fx
y = (v - cy) * z / fy
points.append([x, y, z])
return np.array(points)
points = depth_to_pointcloud(depth_image, fx, fy, cx, cy)
体素(Voxel)
体素是三维空间中的像素概念,用于三维空间的离散化表示。体素化是点云降采样和空间分割的重要技术。
# 使用Open3D创建点云对象
pcd = o3d.geometry.PointCloud()
pcd.points = o3d.utility.Vector3dVector(points)
2. 点云预处理技术
去噪滤波(Noise Filtering)
三维数据往往包含噪声点,需要通过统计方法或几何约束进行过滤:
- 统计滤波: 基于点的邻域统计特性识别离群点
- 半径滤波: 删除指定半径内邻居点过少的点
- 条件滤波: 根据点的属性(如高度、颜色)进行过滤
# 统计离群点移除
def remove_outliers(pcd, nb_neighbors=20, std_ratio=2.0):
cl, ind = pcd.remove_statistical_outlier(
nb_neighbors=nb_neighbors,
std_ratio=std_ratio
)
return cl.select_by_index(ind)
# 半径离群点移除
def remove_radius_outliers(pcd, nb_points=16,

最低0.47元/天 解锁文章
2114

被折叠的 条评论
为什么被折叠?



