V1.0
This commit is contained in:
44
.github/copilot-instructions.md
vendored
44
.github/copilot-instructions.md
vendored
@@ -1,44 +0,0 @@
|
|||||||
# Copilot / AI agent instructions for this repo
|
|
||||||
|
|
||||||
目标:帮助 AI 编码代理快速上手此环视(surround-view)项目,聚焦可验证的代码模式、运行流程和常见修改点。
|
|
||||||
|
|
||||||
- **大体架构**:数据流为 Capture -> Undistort -> Project -> Flip -> Stitch -> WhiteBalance -> Display。主要线程/模块:
|
|
||||||
- `surround_view.capture_thread.CaptureThread`:采集摄像头帧(USB/CSI,可传 `api_preference`)。
|
|
||||||
- `surround_view.fisheye_camera.FisheyeCameraModel`:负责 `undistort()`, `project()`, `flip()` 和相机参数读写(yaml 文件)。
|
|
||||||
- `surround_view.process_thread.CameraProcessingThread`:每个摄像头的处理线程,调用相机模型并写入 `ProjectedImageBuffer`。
|
|
||||||
- `surround_view.birdview.BirdView`:融合/拼接、亮度匹配与白平衡,输出最终鸟瞰图。
|
|
||||||
- 同步/缓冲:`surround_view.imagebuffer.Buffer`、`MultiBufferManager` 与 `ProjectedImageBuffer`,通过 `sync()`/信号等待实现多流同步。
|
|
||||||
|
|
||||||
- **关键运行脚本(推荐顺序)**:
|
|
||||||
1. `python run_calibrate_camera.py`(标定/生成 camera yaml)
|
|
||||||
2. `python run_get_projection_maps.py -camera <front|back|left|right> -scale ... -shift ...`(选择投影点)
|
|
||||||
3. `python run_get_weight_matrices.py`(生成拼接权重/掩码)
|
|
||||||
4. `python run_live_demo.py`(车载/实时 demo)
|
|
||||||
- 调试摄像头采集:`python test_cameras.py`
|
|
||||||
|
|
||||||
- **项目约定 / 易错点(请严格遵循)**:
|
|
||||||
- 摄像头名称固定为 `front, back, left, right`,对应 yaml/param 中的配置;device id 需在本机环境中确认(参见 `test_cameras.py`)。
|
|
||||||
- yaml 文件(`yaml/*.yaml`)里保存的字段:`camera_matrix`, `dist_coeffs`, `resolution`, `project_matrix`, `scale_xy`, `shift_xy`。修改后用 `FisheyeCameraModel.save_data()` 写回。
|
|
||||||
- `param_settings.py` 用 cm 为单位构造 birdview 参数(`total_w/total_h`、`xl/xr/yt/yb` 等),birdview 的切片函数(`FI, FM, ...`)依赖这些常量。
|
|
||||||
- 镜头“翻转”策略在 `FisheyeCameraModel.flip()` 明确:`front` 不变,`back` 180°, `left/right` 用转置+翻转处理。
|
|
||||||
- 缓冲区 `Buffer.add(..., drop_if_full=True)` 会丢帧;修 bug 时注意是否因为丢帧导致状态不一致。
|
|
||||||
|
|
||||||
- **拼接与亮度调整实现要点**(参见 `surround_view/birdview.py` 与 `surround_view/utils.py`):
|
|
||||||
- 权重计算:`get_weight_mask_matrix()` 提取重叠区域并基于点到多边形距离计算平滑权重 G。
|
|
||||||
- 亮度匹配通过 `mean_luminance_ratio()` 聚合重叠区域平均亮度并以几何/经验方式融合(见 `make_luminance_balance()`)。
|
|
||||||
- 白平衡用 `make_white_balance()` 简单按通道均值缩放。
|
|
||||||
|
|
||||||
- **如何修改/扩展(示例)**:
|
|
||||||
- 若加入新相机或改变布局:更新 `param_settings.py` 的 `camera_names`、`project_shapes` 与 `xl/xr/yt/yb`;更新 yaml 参数并通过 `FisheyeCameraModel` 测试 `undistort()`/`project()` 输出。
|
|
||||||
- 若替换采集后端(gstreamer / v4l2),优先修改 `surround_view.utils.gstreamer_pipeline()` 与 `CaptureThread.connect_camera()` 的 `api_preference` 分支,确保 `cap.isOpened()` 行为一致。
|
|
||||||
|
|
||||||
- **测试 / 调试建议**:
|
|
||||||
- 使用 `test_cameras.py` 确认设备索引与支持分辨率。
|
|
||||||
- 单线程走查:直接在 REPL 导入 `FisheyeCameraModel`,用已存在的 yaml 文件运行 `undistort()`、`project()` 并保存图片来验证投影矩阵。
|
|
||||||
- 帧同步问题优先检查 `MultiBufferManager.sync()` 与 `ProjectedImageBuffer.sync()` 的 `do_sync` 与 `sync_devices` 配置。
|
|
||||||
|
|
||||||
- **风格/约定**:
|
|
||||||
- 代码使用 Python 3、OpenCV、PyQt5,多线程依赖 `QThread` + Qt 同步原语;避免用 `time.sleep()` 作为同步手段。
|
|
||||||
- 尽量在修改后用现有脚本跑完整流程(calibrate -> get_projection -> get_weight -> live_demo)以捕获参数联动问题。
|
|
||||||
|
|
||||||
如果需要,我可以把这些点合并成更短或更详尽的版本,或者加入常见问题/故障排查列表;或者你希望我直接提交此文件为 PR?请告诉我想要的调整或遗漏的内容。
|
|
||||||
12
.vscode/tasks.json
vendored
12
.vscode/tasks.json
vendored
@@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
|
||||||
// for the documentation about the tasks.json format
|
|
||||||
"version": "2.0.0",
|
|
||||||
"tasks": [
|
|
||||||
{
|
|
||||||
"label": "kill python",
|
|
||||||
"type": "shell",
|
|
||||||
"command": "pkill -f python3"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
205
README.md
205
README.md
@@ -1,9 +1,206 @@
|
|||||||
一份简单的环视系统制作实现,包含完整的标定、投影、拼接和实时运行流程,详细文档见 `doc` 目录。环视系统的开源代码很少见,希望大家积极提 issue 和 pull request,让这个项目能更好地有益于入门者学习。
|
# LJ360 - 360全景人员接近预警系统
|
||||||
|
|
||||||
|
LJ360是一个基于OpenCV开发的360度全景人员接近预警系统,支持多摄像头拼接、雷达距离检测和人体检测、web配置等功能。
|
||||||
|
|
||||||
|
## 更新
|
||||||
|
- 2025-12-25: CPP版本360环视成功运行
|
||||||
|
- 2025-12-23: 增加Flask框架,支持WEB预览
|
||||||
|
- 2025-12-20: 增加YOLOv5模型,支持人员检测
|
||||||
|
- 2025-12-19: Python版本360环视成功运行
|
||||||
|
- 2025-12-16: 单路摄像头投影生成
|
||||||
|
- 2025-12-15: 加载V4L2后端 移除gstreamer
|
||||||
|
- 2025-12-12:模拟摄像头内参矩阵和畸变系数计算
|
||||||
|
---
|
||||||
|
- 2025-12-02: 本地视频360合成
|
||||||
|
- 2025-11-03:YOLO融合 雷达预警
|
||||||
|
- 2025-11-01:网络摄像头四分屏
|
||||||
|
- 2025-10-30:初始版本发布
|
||||||
|
|
||||||
|
|
||||||
This is a simple implementation of a surround view system, including calibration, projection, stitching, and real-time running processes. The [English documentation](https://github.com/hynpu/surround-view-system-introduction/blob/master/doc/en.md) can be found in the `doc` folder.
|
## 功能
|
||||||
|
|
||||||
|
- **多摄像头拼接**:支持4个鱼眼摄像头实时拼接成360度全景视图
|
||||||
|
- **图像校正**:自动对鱼眼镜头的畸变进行校正
|
||||||
|
- **雷达检测**:支持串口雷达距离检测,实时显示障碍物距离
|
||||||
|
- **人体检测**:集成YOLO目标检测算法,实时检测行人
|
||||||
|
- **Web界面**:提供Web界面查看全景视频流
|
||||||
|
- **硬件加速**:支持RKNN神经网络加速和OpenCL GPU加速
|
||||||
|
|
||||||
|
## 系统要求
|
||||||
|
|
||||||
|
- Python 3.8
|
||||||
|
- OpenCV 4.0+
|
||||||
|
- NumPy
|
||||||
|
- RKNN Toolkit Lite (用于神经网络加速)
|
||||||
|
- Serial (用于雷达通信)
|
||||||
|
- Flask (用于Web界面)
|
||||||
|
|
||||||
|
## 硬件要求
|
||||||
|
|
||||||
|
- 4个鱼眼摄像头 (1920*1080@25fps)
|
||||||
|
- 4路AHD转MIPI TP2815接口板
|
||||||
|
- 摄像头映射关系:video0(前)、video1(左)、video2(后)、video3(右)
|
||||||
|
- 雷达模块 (支持串口通信)
|
||||||
|
- RK3588平台 (用于RKNN加速和系统主控)
|
||||||
|
|
||||||
|
## 安装步骤
|
||||||
|
|
||||||
|
1. 克隆项目代码:
|
||||||
|
```bash
|
||||||
|
git clone <repository_url>
|
||||||
|
cd LJ360
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 安装依赖:
|
||||||
|
```bash
|
||||||
|
NULL
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 配置摄像头参数:
|
||||||
|
- 在`yaml/`目录下为每个摄像头创建配置文件
|
||||||
|
- 配置文件包含摄像头的内参、外参和畸变参数
|
||||||
|
|
||||||
|
4. 配置雷达参数:
|
||||||
|
- 在`web.py`中修改雷达串口配置
|
||||||
|
- 调整距离阈值参数
|
||||||
|
|
||||||
|
## 使用方法
|
||||||
|
|
||||||
|
### 1. 主要运行文件 (推荐)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python3 web.py
|
||||||
|
```
|
||||||
|
|
||||||
|
该脚本是系统的主要运行文件,同时实现:
|
||||||
|
- 4个摄像头的实时图像捕获
|
||||||
|
- 鱼眼图像校正和拼接
|
||||||
|
- 360度全景视图生成
|
||||||
|
- Web服务器启动,提供全景视频流访问
|
||||||
|
|
||||||
|
启动后,在浏览器中访问`http://localhost:5000`查看全景视频流。
|
||||||
|
显示器同步显示360度全景视图和YOLO检测结果。
|
||||||
|
|
||||||
|
|
||||||
# Use cases
|
### 2. 运行摄像头校准
|
||||||
|
|
||||||

|
```bash
|
||||||
|
python run_calibrate_camera.py
|
||||||
|
```
|
||||||
|
|
||||||
|
用于校准摄像头参数,生成yaml配置文件。
|
||||||
|
|
||||||
|
### 3. 生成投影映射
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python run_get_projection_maps.py
|
||||||
|
```
|
||||||
|
|
||||||
|
生成图像投影映射,用于提高拼接效率。
|
||||||
|
|
||||||
|
### 4. 生成权重矩阵
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python run_get_weight_matrices.py
|
||||||
|
```
|
||||||
|
|
||||||
|
生成图像拼接的权重矩阵,用于平滑过渡。
|
||||||
|
|
||||||
|
## 项目结构
|
||||||
|
|
||||||
|
```
|
||||||
|
LJ360/
|
||||||
|
├── cpp/ # C++实现的相关功能 开发中
|
||||||
|
│ └── AdasSourrondView/ # 360度全景视图C++实现
|
||||||
|
├── py_utils/ # Python工具模块
|
||||||
|
│ ├── rknn_executor.py # RKNN模型执行器
|
||||||
|
│ └── coco_utils.py # COCO数据集工具
|
||||||
|
├── surround_view/ # 全景视图核心模块
|
||||||
|
│ ├── birdview.py # 鸟瞰图生成
|
||||||
|
│ ├── fisheye_camera.py # 鱼眼相机模型
|
||||||
|
│ ├── capture_thread.py # 图像捕获线程
|
||||||
|
│ └── process_thread.py # 图像处理线程
|
||||||
|
├── yaml/ # 摄像头配置文件
|
||||||
|
├── model/ # 深度学习模型
|
||||||
|
├── images/ # 静态图像资源
|
||||||
|
├── web.py # 主程序
|
||||||
|
├── run_live_demo.py # 实时演示脚本
|
||||||
|
├── run_calibrate_camera.py # 摄像头校准脚本
|
||||||
|
├── run_get_projection_maps.py # 生成投影映射脚本
|
||||||
|
├── run_get_weight_matrices.py # 生成权重矩阵脚本
|
||||||
|
└── README.md # 项目说明文档
|
||||||
|
```
|
||||||
|
|
||||||
|
## 配置文件说明
|
||||||
|
|
||||||
|
### 摄像头配置文件 (yaml/*.yaml)
|
||||||
|
|
||||||
|
每个摄像头需要一个yaml配置文件,包含以下参数:
|
||||||
|
|
||||||
|
- `camera_matrix`: 相机内参矩阵
|
||||||
|
- `dist_coeffs`: 畸变系数
|
||||||
|
- `rotation_vector`: 旋转向量
|
||||||
|
- `translation_vector`: 平移向量
|
||||||
|
- `projection_matrix`: 投影矩阵
|
||||||
|
|
||||||
|
### 雷达配置
|
||||||
|
|
||||||
|
在`web.py`中配置雷达参数:
|
||||||
|
|
||||||
|
- `RADAR_SERIAL_PORT`: 雷达串口
|
||||||
|
- `RADAR_BAUDRATE`: 波特率
|
||||||
|
- `DISTANCE_THRESHOLD`: 距离阈值
|
||||||
|
|
||||||
|
### YOLO配置
|
||||||
|
|
||||||
|
在`web.py`中配置YOLO目标检测参数:
|
||||||
|
|
||||||
|
- `YOLO_MODEL_PATH`: YOLO模型路径
|
||||||
|
- `OBJ_THRESH`: 目标检测阈值
|
||||||
|
- `NMS_THRESH`: 非极大值抑制阈值
|
||||||
|
- `IMG_SIZE`: 输入图像大小
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
1. 确保所有摄像头的分辨率设置一致
|
||||||
|
2. 摄像头校准需要使用棋盘格进行
|
||||||
|
3. 雷达模块需要正确连接到串口
|
||||||
|
4. RKNN模型需要使用RKNN Toolkit转换生成
|
||||||
|
5. 运行前请确保所有依赖已正确安装
|
||||||
|
|
||||||
|
## 故障排除
|
||||||
|
|
||||||
|
### 摄像头无法连接
|
||||||
|
|
||||||
|
- 检查摄像头ID是否正确
|
||||||
|
- 确保摄驱动框架V4L2已安装
|
||||||
|
- 检查MIPI接口连接
|
||||||
|
|
||||||
|
### 图像拼接异常
|
||||||
|
|
||||||
|
- 检查摄像头校准参数
|
||||||
|
- 确保所有摄像头的视角重叠区域足够
|
||||||
|
- 调整权重矩阵参数
|
||||||
|
|
||||||
|
### 雷达无数据
|
||||||
|
|
||||||
|
- 检查串口连接
|
||||||
|
- 检查雷达波特率设置
|
||||||
|
- 确保雷达模块正常工作
|
||||||
|
|
||||||
|
## 更新日志
|
||||||
|
|
||||||
|
### v1.0.0
|
||||||
|
- 初始版本发布
|
||||||
|
- 支持4摄像头拼接
|
||||||
|
- 集成雷达距离检测
|
||||||
|
- 支持人体检测
|
||||||
|
- 提供Web界面
|
||||||
|
|
||||||
|
## 许可证
|
||||||
|
|
||||||
|
本项目采用MIT许可证,详见LICENSE文件。
|
||||||
|
|
||||||
|
## 联系方式
|
||||||
|
|
||||||
|
如有问题或建议,请联系项目维护者。
|
||||||
|
|||||||
Reference in New Issue
Block a user