You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lxCameraApi/PATH_STRUCTURE.md

311 lines
9.3 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 文件保存路径结构说明
## 概述
本系统采用分层目录结构保存相机拍摄的图片和点云数据,便于管理和查找。
## 路径格式
### 完整路径格式
```
basePath/日期/类型/SN_类型_时间戳.扩展名
```
### 路径组成
| 组成部分 | 说明 | 示例 |
|---------|------|------|
| basePath | 基础保存路径 | `D:/output` |
| 日期 | 拍摄日期yyyyMMdd | `20250325` |
| 类型 | 文件类型文件夹 | `amplitude`、`rgb`、`depth`、`depthColor`、`pointCloud` |
| SN | 相机序列号 | `192.168.1.100` |
| 类型 | 重复文件类型 | `amplitude`、`rgb`、`depth`、`depthColor`、`pointcloud` |
| 时间戳 | 拍摄时间yyyyMMdd_HHmmss | `20250325_143022` |
| 扩展名 | 文件扩展名 | `.png`、`.pcd` |
## 目录树示例
```
D:/output/
├── 20250325/ # 日期2025年3月25日
│ ├── amplitude/ # 强度图
│ │ ├── 192.168.1.100_amplitude_20250325_143022.png
│ │ ├── 192.168.1.101_amplitude_20250325_143023.png
│ │ └── 192.168.1.102_amplitude_20250325_143024.png
│ ├── rgb/ # RGB彩色图
│ │ ├── 192.168.1.100_rgb_20250325_143022.png
│ │ ├── 192.168.1.101_rgb_20250325_143023.png
│ │ └── 192.168.1.102_rgb_20250325_143024.png
│ ├── depth/ # 深度图
│ │ ├── 192.168.1.100_depth_20250325_143022.png
│ │ ├── 192.168.1.101_depth_20250325_143023.png
│ │ └── 192.168.1.102_depth_20250325_143024.png
│ ├── depthColor/ # 彩色深度图
│ │ ├── 192.168.1.100_depth_color_20250325_143022.png
│ │ ├── 192.168.1.101_depth_color_20250325_143023.png
│ │ └── 192.168.1.102_depth_color_20250325_143024.png
│ └── pointCloud/ # 点云数据
│ ├── 192.168.1.100_pointcloud_20250325_143022.pcd
│ ├── 192.168.1.101_pointcloud_20250325_143023.pcd
│ └── 192.168.1.102_pointcloud_20250325_143024.pcd
├── 20250326/ # 日期2025年3月26日
│ ├── amplitude/
│ ├── rgb/
│ ├── depth/
│ ├── depthColor/
│ └── pointCloud/
└── 20250327/ # 日期2025年3月27日
├── amplitude/
├── rgb/
├── depth/
├── depthColor/
└── pointCloud/
```
## 文件命名规则
### 命名格式
```
{SN}_{type}_{timestamp}.{ext}
```
### 示例说明
| 文件名 | 说明 |
|--------|------|
| `192.168.1.100_amplitude_20250325_143022.png` | 相机192.168.1.100在2025年3月25日14:30:22拍摄的强度图 |
| `192.168.1.100_rgb_20250325_143022.png` | 相机192.168.1.100在2025年3月25日14:30:22拍摄的RGB图 |
| `192.168.1.100_depth_20250325_143022.png` | 相机192.168.1.100在2025年3月25日14:30:22拍摄的深度图 |
| `192.168.1.100_depth_color_20250325_143022.png` | 相机192.168.1.100在2025年3月25日14:30:22拍摄的彩色深度图 |
| `192.168.1.100_pointcloud_20250325_143022.pcd` | 相机192.168.1.100在2025年3月25日14:30:22拍摄的点云数据 |
## 类型说明
| 类型文件夹 | 文件扩展名 | 说明 |
|-----------|-----------|------|
| `amplitude` | `.png` | 强度图(灰度图) |
| `rgb` | `.png` | RGB彩色图像 |
| `depth` | `.png` | 深度图(灰度表示) |
| `depthColor` | `.png` | 彩色深度图(使用伪彩色映射) |
| `pointCloud` | `.pcd` | 3D点云数据PCD格式 |
## 使用建议
### 1. 按日期管理数据
```
# 查看某一天的所有数据
D:/output/20250325/
# 删除某一天的数据
rm -rf D:/output/20250325/
```
### 2. 按类型批量处理
```
# 处理所有点云数据
D:/output/20250325/pointCloud/
# 处理所有RGB图像
D:/output/20250325/rgb/
```
### 3. 按相机查找
```
# 查找某个相机的所有数据
find D:/output/20250325/ -name "192.168.1.100_*"
```
### 4. 定期清理旧数据
```java
// 删除30天前的数据
import java.io.File;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
public class DataCleaner {
public static void cleanOldData(String basePath, int daysToKeep) {
LocalDate cutoffDate = LocalDate.now().minusDays(daysToKeep);
File baseDir = new File(basePath);
File[] dateDirs = baseDir.listFiles(File::isDirectory);
if (dateDirs == null) return;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
for (File dateDir : dateDirs) {
try {
LocalDate dirDate = LocalDate.parse(dateDir.getName(), formatter);
if (dirDate.isBefore(cutoffDate)) {
deleteDirectory(dateDir);
System.out.println("已删除: " + dateDir.getAbsolutePath());
}
} catch (Exception e) {
System.err.println("无法解析日期: " + dateDir.getName());
}
}
}
private static void deleteDirectory(File dir) {
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
deleteDirectory(file);
} else {
file.delete();
}
}
}
dir.delete();
}
public static void main(String[] args) {
cleanOldData("D:/output", 30); // 保留30天
}
}
```
### 5. 数据备份策略
```bash
# 备份指定日期的数据
tar -czf backup_20250325.tar.gz D:/output/20250325/
# 备份指定类型的数据
tar -czf backup_pointcloud.tar.gz D:/output/*/pointCloud/
```
### 6. 数据迁移
```java
// 将数据迁移到新位置
import java.nio.file.*;
public class DataMigrator {
public static void migrateData(String oldPath, String newPath) throws IOException {
Path source = Paths.get(oldPath);
Path target = Paths.get(newPath);
// 递归复制目录
Files.walkFileTree(source, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
Path targetDir = target.resolve(source.relativize(dir));
Files.createDirectories(targetDir);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
Path targetFile = target.resolve(source.relativize(file));
Files.copy(file, targetFile, StandardCopyOption.REPLACE_EXISTING);
return FileVisitResult.CONTINUE;
}
});
}
public static void main(String[] args) throws IOException {
migrateData("D:/output", "E:/backup");
}
}
```
## API响应示例
### 单次拍照(点云)
```json
{
"success": true,
"errorCode": 0,
"errorMessage": null,
"errorDescription": "成功",
"retryCount": 1,
"cameraSn": "192.168.1.100",
"filePaths": {
"pointCloud": "D:/output/20250325/pointCloud/192.168.1.100_pointcloud_20250325_143022.pcd"
}
}
```
### 全类型拍照
```json
{
"success": true,
"errorCode": 0,
"errorMessage": null,
"errorDescription": "成功",
"retryCount": 1,
"cameraSn": "192.168.1.100",
"filePaths": {
"amplitude": "D:/output/20250325/amplitude/192.168.1.100_amplitude_20250325_143022.png",
"rgb": "D:/output/20250325/rgb/192.168.1.100_rgb_20250325_143022.png",
"depth": "D:/output/20250325/depth/192.168.1.100_depth_20250325_143022.png",
"depthColor": "D:/output/20250325/depthColor/192.168.1.100_depth_color_20250325_143022.png",
"pointCloud": "D:/output/20250325/pointCloud/192.168.1.100_pointcloud_20250325_143022.pcd"
}
}
```
## 注意事项
1. **目录自动创建**:系统会自动创建所需的目录结构,无需手动创建
2. **时间戳精度**:时间戳精确到秒,同一秒内多次拍照文件名会重复
3. **文件覆盖**:如果文件名相同,新文件会覆盖旧文件
4. **权限要求**确保程序对basePath有读写权限
5. **磁盘空间**:注意监控磁盘空间,特别是保存点云数据时
6. **路径长度**Windows系统路径长度限制为260字符建议使用较短的basePath
## 常见问题
### Q1: 如何修改日期格式?
答:日期格式在 `LxCameraServiceImpl.java` 中定义:
```java
String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
```
可以修改为 `yyyy-MM-dd` 等其他格式。
### Q2: 如何修改文件命名规则?
答:文件名在 `LxCameraServiceImpl.java` 中生成:
```java
String ampPath = basePath + "/" + date + "/amplitude/" + cameraSn + "_amplitude_" + timestamp + ".png";
```
可以根据需要修改。
### Q3: 如何压缩历史数据?
可以使用zip或tar命令
```bash
# 压缩2025年3月的所有数据
tar -czf output_202503.tar.gz D:/output/20250325/ D:/output/20250326/ D:/output/20250327/
# 压缩后删除原始数据
rm -rf D:/output/20250325/ D:/output/20250326/ D:/output/20250327/
```
### Q4: 如何统计磁盘占用?
答:使用以下命令:
```bash
# Windows
powershell "Get-ChildItem D:/output -Recurse | Measure-Object -Property Length -Sum"
# Linux/Mac
du -sh D:/output/*
```