python 去除点云中的nan点,transform点云

去除点云中的nan点

import yaml
import time
import pcl
from tqdm import tqdm

def filter_nan(pcd_path):
    cloud = pcl.load_XYZI(pcd_path)
    pt = cloud.to_array()[:, :4]

    #### filter NAN points
    t=[]
    for n in range(0, len(pt)):
        x = pt[n][0]
        y = pt[n][1]
        z = pt[n][2]
        if (np.isnan(x) or np.isnan(y) or np.isnan(z)):
            continue
        t.append(n)
    pt = pt[t]

    cloud.from_array(pt)
    pcl.save(cloud, pcd_path)

with open("pcd_path_list.txt") as f:
    pcd_list = f.read().splitlines()
    for i, pcd_path in enumerate(tqdm(pcd_list)):
        filter_nan(pcd_path)

transform点云

# -*- coding: UTF-8 -*-
import numpy as np
import os
import argparse
import sys
import yaml
import time
import pcl
from tqdm import tqdm
from scipy.spatial.transform import Rotation as R

transform_matrix = np.zeros((4, 4), dtype=np.float32)

def merge_tr(translation, rotation):
    transform_matrix[0:3, 0:3] = rotation
    transform_matrix[0:3, 3] = np.array([translation])
    transform_matrix[3, 0:4] = np.array([0, 0, 0, 1])

def transform(pcd_path):
    # 这个办法会把好像intensity以及后面的去掉
    cloud = pcl.load_XYZI(pcd_path)
    pt = cloud.to_array()[:, :3]
    intensity = cloud.to_array()[:, 3].reshape(-1, 1)
    
    pad_pt = np.ones((pt.shape[0], 1), dtype=pt.dtype)
    pt = np.concatenate((pt, pad_pt), axis=1)
    trans_pt = np.dot(transform_matrix, pt.T).T
    #trans_pt = np.dot(np.linalg.inv(transform_matrix), pt.T).T

    trnas_pt = np.concatenate((trans_pt[:, 0:3], intensity), axis=1)
    trans_cloud = pcl.PointCloud_PointXYZI()
    trans_cloud.from_array(trans_pt)
    pcl.save(trans_cloud, pcd_path)

def get_transform_matrix(yaml_file):
    with open(yaml_file) as f:
        data = yaml.load(f, Loader=yaml.FullLoader)
        try:
            translation = data['transform']['translation']
            rotation = data['transform']['rotation']
        except:
            translation = data['translation']
            rotation = data['rotation']
        r = R.from_quat([rotation['x'], rotation['y'], rotation['z'], rotation['w']])
        rotation_matrix = r.as_matrix()
        ##### get init_transform_matrix(3*4)
        merge_tr([translation['x'], translation['y'], translation['z']] , \
                rotation_matrix)

if __name__ == '__main__':
    get_transform_matrix("D_2_A.yaml")
    with open("pcd_path_list.txt") as f:
        pcd_list = f.read().splitlines()
        for i, pcd_path in enumerate(tqdm(pcd_list)):
            transform(pcd_path)

点云配准是将两个或多个点云对齐,使它们在三维空间重叠。在Python,可以使用开源库Open3D进行点云配准。 下面是一个基本的点云配准示例: ```python import open3d as o3d # 加载点云 source = o3d.io.read_point_cloud("source.pcd") target = o3d.io.read_point_cloud("target.pcd") # 执行ICP算法 icp_result = o3d.registration.registration_icp( source, target, max_correspondence_distance=0.02, estimation_method=o3d.registration.TransformationEstimationPointToPoint(), criteria=o3d.registration.ICPConvergenceCriteria(max_iteration=200)) # 将变换应用于源点云 source.transform(icp_result.transformation) # 可视化结果 o3d.visualization.draw_geometries([source, target]) ``` 其,`source.pcd`和`target.pcd`是要配准的两个点云文件路径。`registration_icp`函数执行ICP算法来计算两个点云之间的变换,然后将变换应用于源点云。 除了ICP算法外,还有其他一些点云配准算法,如FAST Global Registration(FastGlo),可以在Open3D使用。 点云滤波是将点云数据进行降噪或精简的过程。Open3D提供了多种点云滤波器,如统计滤波器和半径滤波器。 下面是一个基本的点云统计滤波器示例: ```python import open3d as o3d # 加载点云 pcd = o3d.io.read_point_cloud("input.pcd") # 执行统计滤波器 pcd_filtered = pcd.voxel_down_sample(voxel_size=0.05) # 可视化结果 o3d.visualization.draw_geometries([pcd, pcd_filtered]) ``` 其,`input.pcd`是要滤波的点云文件路径。`voxel_down_sample`函数执行统计滤波器来对点云进行下采样,`voxel_size`参数指定了采样的体素大小。 类似地,半径滤波器可以用来去除离群或降低点云密度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值