Metadata-Version: 2.4
Name: mini-camera-intrinsic
Version: 0.0.3
Summary: 按相机型号（DESAYSV/PONY）解析内参，返回统一 dict，支持保存为与 D02 一致的 YAML 格式。
License-Expression: MIT
Requires-Python: >=3.10
Description-Content-Type: text/markdown
Requires-Dist: PyYAML>=6.0
Provides-Extra: dev
Requires-Dist: pytest; extra == "dev"
Requires-Dist: build; extra == "dev"
Requires-Dist: twine; extra == "dev"

# mini-camera-intrinsic

按相机型号解析内参，返回统一字典；支持保存为与 D02（pb_calibration）一致的本地 YAML 格式。

## 安装

```bash
pip install mini-camera-intrinsic
```

## 功能

- **parse_intrinsics(camera_model, **kwargs)**：按相机型号解析，返回 `List[dict]`，每项与 D02 单组内参 YAML 同构。
- **parse_intrinsics_from_dir(camera_model, root_dir, **kwargs)**：按相机型号 + 根目录自动遍历子目录，发现对应格式的 log / camera_id 后调用上层解析逻辑，返回 `List[dict]`。
- **save_intrinsics_to_dir(intrinsics_list, output_dir)**：将上述列表写入 `output_dir/intrinsics/*.yaml`。

支持的相机型号（硬编码）：`DESAYSV`、`PONY`。

## 快速开始

### DESAYSV（按精细参数传入）

需提供 log 来源（目录或文件列表）与 camera_id 映射（**camera_id 文件路径**或 dict，不能传文件夹路径）：

```python
from mini_camera_intrinsic import parse_intrinsics, save_intrinsics_to_dir, CAMERA_MODEL_DESAYSV

# 方式一：log 目录 + camera_id 文件
items = parse_intrinsics(
    CAMERA_MODEL_DESAYSV,
    log_dir="/path/to/log_dir",
    camera_id_path="/path/to/camera_id",
)

# 方式二：log 文件列表 + camera_id 映射
items = parse_intrinsics(
    CAMERA_MODEL_DESAYSV,
    log_paths=["/path/to/camera_30.log", "/path/to/camera_100.log"],
    camera_id_mapping={1: "front_30", 2: "front_120"},
)

# 返回 List[dict]，可保存到本地
save_intrinsics_to_dir(items, "/path/to/output_dir")
```

### PONY（按精细参数传入）

需提供 log 文件路径：

```python
from mini_camera_intrinsic import parse_intrinsics, CAMERA_MODEL_PONY

items = parse_intrinsics(
    CAMERA_MODEL_PONY,
    log_path="/path/to/drivers_camera_pony.log.INFO.xxx",
)
# 或 file_path=...
```

### 按目录自动解析（推荐方式）

当你已经有一整个相机日志目录（例如本仓库的 `tests/fixtures`），可以仅传入根目录，由库内部自动遍历子文件夹并发现需要的 log / camera_id 文件：

```python
from mini_camera_intrinsic import (
    CAMERA_MODEL_DESAYSV,
    CAMERA_MODEL_PONY,
    parse_intrinsics_from_dir,
    save_intrinsics_to_dir,
)

# DESAYSV：传入包含 .log 和 camera_id 的根目录
items_desay = parse_intrinsics_from_dir(
    CAMERA_MODEL_DESAYSV,
    root_dir="./tests/fixtures/DESAYSV",  # 相对路径或绝对路径均可
)

# PONY：传入包含 pony log 的根目录
items_pony = parse_intrinsics_from_dir(
    CAMERA_MODEL_PONY,
    root_dir="./tests/fixtures/PONY",
)

# 统一保存为 D02 风格的 YAML
save_intrinsics_to_dir(items_desay, "./output_desay")
save_intrinsics_to_dir(items_pony, "./output_pony")
```

典型工程用法：只要日志目录结构与 `tests/fixtures` 类似（DESAYSV 目录下有若干 `*.log` 和一个 `camera_id` 文件，PONY 目录下有 `*.INFO*` 或 `*.log*`），即可直接将该目录路径作为 `root_dir` 传入。

### 返回格式（dict）

每条内参与 D02 单组 intrinsic YAML 一致，例如：

- `frame_id`: str  
- `model_type`: `"PINHOLE"` | `"FISHEYE"`  
- `pinhole`（或 `fisheye`）: `width`, `height`, `intrinsic`（9 个数）, `distortion`（4 或 8 个数）

便于 API 调用与 `save_intrinsics_to_dir` 入参。

## 依赖

- Python >= 3.10  
- PyYAML >= 6.0  

## License

MIT
