|
| 1 | +#!/bin/bash |
| 2 | +# 多帧点云融合脚本 |
| 3 | +# 用法: ./fuse.sh [输入目录] [输出文件] |
| 4 | + |
| 5 | +set -e |
| 6 | + |
| 7 | +# 颜色定义 |
| 8 | +GREEN='\033[0;32m' |
| 9 | +YELLOW='\033[1;33m' |
| 10 | +BLUE='\033[0;34m' |
| 11 | +NC='\033[0m' |
| 12 | + |
| 13 | +# 默认路径 |
| 14 | +DEFAULT_INPUT="outputs/video_output/voxelized" |
| 15 | +DEFAULT_OUTPUT="outputs/video_output/fused_map.ply" |
| 16 | + |
| 17 | +# 解析参数 |
| 18 | +INPUT_DIR="${1:-$DEFAULT_INPUT}" |
| 19 | +OUTPUT_FILE="${2:-$DEFAULT_OUTPUT}" |
| 20 | + |
| 21 | +# 显示帮助 |
| 22 | +if [[ "$1" == "-h" || "$1" == "--help" ]]; then |
| 23 | + echo "多帧点云融合脚本" |
| 24 | + echo "" |
| 25 | + echo "用法: ./fuse.sh [输入目录] [输出文件] [选项]" |
| 26 | + echo "" |
| 27 | + echo "参数:" |
| 28 | + echo " 输入目录 包含 vox_*.ply 文件的目录 (默认: $DEFAULT_INPUT)" |
| 29 | + echo " 输出文件 融合后的点云文件路径 (默认: $DEFAULT_OUTPUT)" |
| 30 | + echo "" |
| 31 | + echo "选项:" |
| 32 | + echo " -h, --help 显示帮助" |
| 33 | + echo "" |
| 34 | + echo "示例:" |
| 35 | + echo " ./fuse.sh # 使用默认路径" |
| 36 | + echo " ./fuse.sh outputs/my_scan # 指定输入目录" |
| 37 | + echo " ./fuse.sh outputs/my_scan my_map.ply # 指定输入和输出" |
| 38 | + echo "" |
| 39 | + echo "高级用法 (直接调用 aylm):" |
| 40 | + echo " aylm fuse -i 输入目录 -o 输出文件 --icp-distance 0.1 --voxel-size 0.05" |
| 41 | + exit 0 |
| 42 | +fi |
| 43 | + |
| 44 | +# 检查输入目录 |
| 45 | +if [[ ! -d "$INPUT_DIR" ]]; then |
| 46 | + echo -e "${YELLOW}错误: 输入目录不存在: $INPUT_DIR${NC}" |
| 47 | + exit 1 |
| 48 | +fi |
| 49 | + |
| 50 | +# 统计点云文件 |
| 51 | +PLY_COUNT=$(find "$INPUT_DIR" -name "vox_*.ply" 2>/dev/null | wc -l | tr -d ' ') |
| 52 | + |
| 53 | +if [[ "$PLY_COUNT" -eq 0 ]]; then |
| 54 | + echo -e "${YELLOW}错误: 未找到 vox_*.ply 文件${NC}" |
| 55 | + echo "目录: $INPUT_DIR" |
| 56 | + exit 1 |
| 57 | +fi |
| 58 | + |
| 59 | +# 显示信息 |
| 60 | +echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" |
| 61 | +echo -e "${GREEN}多帧点云融合${NC}" |
| 62 | +echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" |
| 63 | +echo "" |
| 64 | +echo -e "输入目录: ${GREEN}$INPUT_DIR${NC}" |
| 65 | +echo -e "点云数量: ${GREEN}$PLY_COUNT${NC} 帧" |
| 66 | +echo -e "输出文件: ${GREEN}$OUTPUT_FILE${NC}" |
| 67 | +echo "" |
| 68 | + |
| 69 | +# 列出点云文件 |
| 70 | +echo "点云文件:" |
| 71 | +find "$INPUT_DIR" -name "vox_*.ply" | sort | while read f; do |
| 72 | + SIZE=$(du -h "$f" | cut -f1) |
| 73 | + echo " $(basename "$f") ($SIZE)" |
| 74 | +done |
| 75 | +echo "" |
| 76 | + |
| 77 | +# 激活虚拟环境 |
| 78 | +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" |
| 79 | +if [[ -d "$SCRIPT_DIR/aylm_env" ]]; then |
| 80 | + source "$SCRIPT_DIR/aylm_env/bin/activate" |
| 81 | +fi |
| 82 | + |
| 83 | +# 执行融合 |
| 84 | +echo -e "${BLUE}开始融合...${NC}" |
| 85 | +echo "" |
| 86 | + |
| 87 | +aylm fuse -i "$INPUT_DIR" -o "$OUTPUT_FILE" -v |
| 88 | + |
| 89 | +# 检查结果 |
| 90 | +if [[ -f "$OUTPUT_FILE" ]]; then |
| 91 | + echo "" |
| 92 | + echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" |
| 93 | + echo -e "${GREEN}融合完成!${NC}" |
| 94 | + echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" |
| 95 | + |
| 96 | + OUTPUT_SIZE=$(du -h "$OUTPUT_FILE" | cut -f1) |
| 97 | + echo "" |
| 98 | + echo -e "输出文件: ${GREEN}$OUTPUT_FILE${NC} ($OUTPUT_SIZE)" |
| 99 | + |
| 100 | + # 检查位姿文件 |
| 101 | + POSES_FILE="${OUTPUT_FILE%.ply}.poses.json" |
| 102 | + if [[ -f "$POSES_FILE" ]]; then |
| 103 | + echo -e "位姿轨迹: ${GREEN}$POSES_FILE${NC}" |
| 104 | + fi |
| 105 | + |
| 106 | + echo "" |
| 107 | + echo "查看结果:" |
| 108 | + echo " open $OUTPUT_FILE # macOS 默认应用打开" |
| 109 | + echo " meshlab $OUTPUT_FILE # 使用 MeshLab 查看" |
| 110 | +fi |
0 commit comments