基于ZED SDK和YOLO分割模型的SVO文件损伤检测与点云标记系统。
- 损伤检测: 使用YOLO分割模型自动检测视频帧中的损伤区域
- 3D点云标记: 将2D检测结果映射到3D点云,标记损伤位置
- 多输出格式: 生成原始点云、标记点云、仅损伤区域点云等多种输出
- 点云后处理: 密度过滤、统计滤波、法线估计、曲率过滤、聚类
- 损伤面积计算: 基于Ball Pivoting算法计算损伤区域表面积
git clone <repository-url>
cd python# 使用conda(推荐)
conda create -n zed python=3.10
conda activate zed
# 或使用venv
python -m venv venv
# Windows: venv\Scripts\activate
# Linux/Mac: source venv/bin/activatepip install -r requirements.txt依赖包包括:
pyzed- ZED SDK Python APIopen3d- 点云处理和可视化ultralytics- YOLO模型opencv-python- 图像处理numpy,scipy,pandas- 数值计算
按照官方指南安装pyzed。
下载或训练YOLO分割模型,默认使用seg.pt:
# 将模型文件放在项目根目录
# 或使用自定义路径处理SVO文件并进行损伤检测:
python svo_damage_detection_v2.py --svo "path\to\your.svo2"# 使用自定义模型
python svo_damage_detection_v2.py --svo "path\to\your.svo2" --model "path\to\best.pt"
# 调整置信度阈值(默认0.15)
python svo_damage_detection_v2.py --svo "path\to\your.svo2" --conf 0.2
# 保存检测图像
python svo_damage_detection_v2.py --svo "path\to\your.svo2" --save-images
# 可视化结果
python svo_damage_detection_v2.py --svo "path\to\your.svo2" --visualize# 使用默认参数计算
python calculate_damage_area.py
# 指定damage_only.ply文件
python calculate_damage_area.py --ply "path\to\damage_only.ply"
# 调整重建参数
python calculate_damage_area.py --voxel-size 0.005 --radius 0.03
# 可视化重建表面
python calculate_damage_area.py --visualize运行svo_damage_detection_v2.py后,会在data/damage_detection/<svo_name>/目录下生成以下文件:
| 文件名 | 说明 |
|---|---|
{svo_name}_original.ply |
原始重建点云(无标记,未处理) |
{svo_name}_original_processed.ply |
原始点云(经过后处理) |
{svo_name}_marked.ply |
带红色标记的完整点云(未处理) |
{svo_name}_marked_processed.ply |
带标记点云(经过后处理) |
{svo_name}_damage_only.ply |
仅包含损伤区域的点云(不处理) |
detection_images/ |
检测图像(如启用--save-images) |
SVO文件输入
↓
ZED SDK读取帧
↓
YOLO分割检测 → 生成Mask
↓
提取3D点云(Camera坐标系)
↓
位姿变换 → World坐标系
↓
融合多帧损伤点
↓
提取完整点云(FusedPointCloud)
↓
标记损伤区域(红色)
↓
后处理(过滤、下采样、法线估计)
↓
多格式输出(PLY)
sl.Camera()- ZED相机/SVO文件接口sl.FusedPointCloud()- 融合点云容器zed.extract_whole_spatial_map()- 提取完整空间映射zed.retrieve_measure()- 获取逐帧点云数据YOLO()- 损伤检测模型o3d.geometry.PointCloud()- Open3D点云处理
在svo_damage_detection_v2.py中可修改:
CONF_THRESHOLD = 0.15 # 检测置信度阈值
MARK_COLOR = [1.0, 0.0, 0.0] # 标记颜色(红色)
sample_step = 5 # 点云采样步长
threshold = 0.05 # 损伤点匹配阈值(米)# 密度过滤
density_radius = 0.06 # 搜索半径
min_density = 10 # 最小局部密度
# 统计滤波
nb_neighbors = 20 # 邻居点数
std_ratio = 2.0 # 标准差比率
# 体素下采样
voxel_size = 0.01 # 体素大小(米)
# 法线估计
radius = 0.1 # 搜索半径
max_nn = 30 # 最大邻居数voxel_size = 0.01 # 下采样体素大小
ball_pivoting_search_radius = 0.05 # Ball Pivoting搜索半径- 内存管理: 大型SVO文件可能占用大量内存,建议设置
max_memory_usage参数 - 坐标系: 输出点云使用世界坐标系(World Coordinate System)
- 深度质量: 使用
DEPTH_MODE.NEURAL获得最佳深度估计质量 - GPU需求: YOLO检测和深度估计需要NVIDIA GPU支持
- 模型路径: 确保YOLO模型路径正确,默认使用
seg.pt
| 目录 | 用途 | 内容 |
|---|---|---|
/ (根目录) |
核心功能代码 | 三维重建、损伤检测、量化相关的Python文件 |
docs/ |
文档资料 | Markdown文档、PDF论文、技术文档等 |
utility_scripts/ |
辅助工具 | 测试脚本、批处理工具、论文生成工具等 |
data/ |
输出数据 | 点云文件、检测结果等(已在.gitignore中) |
datasets/ |
数据集 | 训练数据、测试数据(已在.gitignore中) |
核心功能文件(根目录):
svo_damage_detection_v2.py- 损伤检测与点云标记主程序process_svo_main.py- SVO文件处理主程序spatial_mapping_offline.py- 空间映射离线处理point_cloud_processing.py- 点云处理模块point_cloud_converter.py- 点云格式转换calculate_damage_area.py- 损伤面积计算
辅助工具文件(utility_scripts/):
- 测试脚本:
test_*.py - 批处理工具:
batch_*.py - 论文生成工具:
paper_*.py - 旧版本代码:
svo_damage_detection.py(v1)
文档文件(docs/):
- Markdown文档:除README.md外的所有.md文件
- PDF论文:所有.pdf文件
- 技术文档、翻译文档等
python/
├── svo_damage_detection_v2.py # 主程序:损伤检测与点云标记
├── process_svo_main.py # SVO处理主程序
├── spatial_mapping_offline.py # 空间映射离线处理
├── point_cloud_processing.py # 点云处理模块
├── point_cloud_converter.py # 点云格式转换
├── calculate_damage_area.py # 损伤面积计算
├── seg.pt # YOLO分割模型(需自行准备)
├── requirements.txt # Python依赖
├── README.md # 本文件
├── docs/ # 文档资料
│ ├── *.md # Markdown文档
│ └── *.pdf # PDF论文
├── utility_scripts/ # 辅助工具
│ ├── test_*.py # 测试脚本
│ ├── batch_*.py # 批处理工具
│ └── paper_*.py # 论文生成工具
├── data/ # 输出目录(.gitignore)
│ └── damage_detection/
│ └── <svo_name>/
│ ├── *_original.ply
│ ├── *_marked.ply
│ ├── *_damage_only.ply
│ └── ...
└── datasets/ # 数据集(.gitignore)
本项目基于ZED SDK开发,遵循相应许可证协议。
最后更新: 2026-04-04