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

9.3 KiB

文件保存路径结构说明

概述

本系统采用分层目录结构保存相机拍摄的图片和点云数据,便于管理和查找。

路径格式

完整路径格式

basePath/日期/类型/SN_类型_时间戳.扩展名

路径组成

组成部分 说明 示例
basePath 基础保存路径 D:/output
日期 拍摄日期yyyyMMdd 20250325
类型 文件类型文件夹 amplitudergbdepthdepthColorpointCloud
SN 相机序列号 192.168.1.100
类型 重复文件类型 amplitudergbdepthdepthColorpointcloud
时间戳 拍摄时间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. 定期清理旧数据

// 删除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. 数据备份策略

# 备份指定日期的数据
tar -czf backup_20250325.tar.gz D:/output/20250325/

# 备份指定类型的数据
tar -czf backup_pointcloud.tar.gz D:/output/*/pointCloud/

6. 数据迁移

// 将数据迁移到新位置
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响应示例

单次拍照(点云)

{
  "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"
  }
}

全类型拍照

{
  "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 中定义:

String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));

可以修改为 yyyy-MM-dd 等其他格式。

Q2: 如何修改文件命名规则?

答:文件名在 LxCameraServiceImpl.java 中生成:

String ampPath = basePath + "/" + date + "/amplitude/" + cameraSn + "_amplitude_" + timestamp + ".png";

可以根据需要修改。

Q3: 如何压缩历史数据?

可以使用zip或tar命令

# 压缩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: 如何统计磁盘占用?

答:使用以下命令:

# Windows
powershell "Get-ChildItem D:/output -Recurse | Measure-Object -Property Length -Sum"

# Linux/Mac
du -sh D:/output/*