脚本如何批量转换点云数据格式

wen 实用脚本 4

本文目录导读:

脚本如何批量转换点云数据格式

  1. 使用CloudCompare(推荐)
  2. Python + laspy/pyntcloud
  3. 使用PDAL(专业点云处理库)
  4. 使用LASTools命令行工具
  5. 综合转换脚本(支持多种格式)
  6. 支持的常见格式转换

使用CloudCompare(推荐)

# 通过命令行批量转换
cloudcompare.CloudCompare -SILENT -O *.las -C_EXPORT_FMT PLY -SAVE_CLOUDS FILE

Python + laspy/pyntcloud

import laspy
import numpy as np
import open3d as o3d
from pathlib import Path
def batch_convert_pointclouds(input_dir, output_dir, input_format='.las', output_format='.ply'):
    """批量转换点云格式"""
    input_dir = Path(input_dir)
    output_dir = Path(output_dir)
    output_dir.mkdir(exist_ok=True)
    # 获取所有输入文件
    files = list(input_dir.glob(f'*{input_format}'))
    for file in files:
        # 读取点云
        if input_format in ['.las', '.laz']:
            las = laspy.read(file)
            points = np.vstack((las.x, las.y, las.z)).T
            colors = np.vstack((las.red, las.green, las.blue)).T / 65535.0
            pcd = o3d.geometry.PointCloud()
            pcd.points = o3d.utility.Vector3dVector(points)
            if colors.any():
                pcd.colors = o3d.utility.Vector3dVector(colors)
        else:
            pcd = o3d.io.read_point_cloud(str(file))
        # 保存为新格式
        output_file = output_dir / f"{file.stem}{output_format}"
        o3d.io.write_point_cloud(str(output_file), pcd)
        print(f"Converted: {file.name} -> {output_file.name}")
# 使用示例
batch_convert_pointclouds("input_folder", "output_folder", ".las", ".ply")

使用PDAL(专业点云处理库)

import pdal
import json
from pathlib import Path
def batch_convert_pdal(input_dir, output_dir):
    """使用PDAL批量转换点云"""
    input_files = list(Path(input_dir).glob('*.las'))
    for las_file in input_files:
        output_file = Path(output_dir) / f"{las_file.stem}.ply"
        # 创建PDAL pipeline
        pipeline_json = {
            "pipeline": [
                str(las_file),
                {
                    "type": "writers.ply",
                    "filename": str(output_file)
                }
            ]
        }
        # 执行转换
        pipeline = pdal.Pipeline(json.dumps(pipeline_json))
        pipeline.execute()
        print(f"Converted: {las_file.name}")
# 常用格式转换
# las/ laz -> ply
# las/ laz -> txt/csv
# las/ laz -> xyz

使用LASTools命令行工具

# 批量转换LAS到PLY
for file in *.las; do
    las2txt -i "$file" -o "${file%.las}.ply"
done
# 或使用las2las转换格式
las2las -i *.las -o output_directory -target_ply

综合转换脚本(支持多种格式)

import argparse
import glob
import os
import numpy as np
def convert_pointcloud_format(input_file, output_file, input_format, output_format):
    """转换单个点云文件"""
    if input_format == 'las' and output_format == 'txt':
        import laspy
        las = laspy.read(input_file)
        points = np.column_stack((las.x, las.y, las.z, 
                                  las.red, las.green, las.blue))
        np.savetxt(output_file, points, fmt='%.6f %.6f %.6f %d %d %d')
    elif input_format == 'txt' and output_format == 'las':
        import laspy
        data = np.loadtxt(input_file)
        header = laspy.LasHeader(point_format=3, version="1.2")
        las = laspy.LasData(header)
        las.x = data[:, 0]
        las.y = data[:, 1]
        las.z = data[:, 2]
        las.write(output_file)
    # 添加更多格式转换...
def batch_converter(input_dir, output_dir, input_ext, output_ext):
    """批量转换主函数"""
    os.makedirs(output_dir, exist_ok=True)
    pattern = os.path.join(input_dir, f"*.{input_ext}")
    for input_file in glob.glob(pattern):
        basename = os.path.basename(input_file)
        output_file = os.path.join(output_dir, 
                                   f"{os.path.splitext(basename)[0]}.{output_ext}")
        convert_pointcloud_format(input_file, output_file, input_ext, output_ext)
        print(f"Converted: {basename}")
if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='批量转换点云格式')
    parser.add_argument('--input_dir', required=True, help='输入目录')
    parser.add_argument('--output_dir', required=True, help='输出目录')
    parser.add_argument('--input_ext', default='las', help='输入格式')
    parser.add_argument('--output_ext', default='ply', help='输出格式')
    args = parser.parse_args()
    batch_converter(args.input_dir, args.output_dir, 
                    args.input_ext, args.output_ext)

支持的常见格式转换

  • .las/.laz → .ply, .txt, .xyz, .pcd
  • .ply → .las, .txt, .xyz
  • .pcd → .ply, .las, .txt
  • .xyz → .las, .ply, .pcd

选择哪种方法取决于您的具体需求:

  • CloudCompare:最适合可视化验证
  • PDAL:最专业的点云处理
  • Open3D:最适合Python集成
  • LASTools:最快速的批量处理

抱歉,评论功能暂时关闭!