No description
- C++ 89.3%
- QML 5.1%
- Shell 3.5%
- CMake 2.1%
| 3rdparty | ||
| docs | ||
| qml | ||
| resource | ||
| src | ||
| .gitignore | ||
| ARCHITECTURE.md | ||
| CMakeLists.txt | ||
| performance.sh | ||
| README.md | ||
ScoreMaster
基于 Rockchip RK3588 的实时斯诺克台球检测系统,全硬件加速零拷贝。
帧率
YOLOv8 INT8 640x640,3 核 NPU 并行,H.264 测试视频:
| 输入分辨率 | 帧率(量化后) | 帧率(量化前) |
|---|---|---|
| 1280×720 | 110 fps | 60 fps |
| 1920×1080 | 110 fps | 60 fps |
| 3840×2160 | 60 fps | 48 fps |
技术栈
| 组件 | 用途 |
|---|---|
| C++20 / Qt6 QML | 框架与界面 |
| RK3588 NPU ×3 | 推理 (YOLOv8 INT8) |
| Rockchip MPP | H.264 硬解码 + 硬编码 |
| Rockchip RGA | NV12↔RGB 硬缩放/色彩转换 |
| V4L2 | 摄像头驱动 (DMA-BUF) |
快速开始
# 编译
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j8
# 运行
./ScoreMaster
配置
src/core/config.h:
// 视频源
USE_TEST_VIDEO = true // true=H.264文件, false=摄像头
TEST_VIDEO_PATH = ".../test.h264"
CAMERA_DEVICE = "/dev/video0"
// 模型
MODEL_PATH = ".../yolov8_ball_int8.rknn"
NPU_CORES = 3
CONF_THRESHOLD = 0.7
// 编码输出
ENCODE_OUTPUT = ".../output.h264"
调试面板
USE_TEST_VIDEO = true 时显示调试面板(半透明悬浮在右侧):
| 区域 | 内容 |
|---|---|
| FPS 栏 | 实时帧率 / 分辨率 / RGA 耗时 / 编码状态 |
| 比分 | P1 vs P2 (计分逻辑开发中) |
| 球列表 | 检测球详情 (开发中) |
| 控制栏 | 暂停 / 单帧 / 编码开关 / 检测框开关 |
USE_TEST_VIDEO = false 时仅全屏视频,无调试面板。
线程模型
Core 4 解码线程 MPP 硬解码 → frame_queue_
Core 5 管线线程 RGA缩放 → 提交NPU → 收结果 → 显示+编码+qbuf
Core 5-7 NPU Worker rknn_run + NMS后处理 (3核轮转)
Qt Main 主线程 GUI事件循环 + QML渲染
目录结构
src/
├── main.cpp 入口
├── core/
│ ├── config.h 全部参数
│ ├── video_source.h 视频源抽象接口 (VideoFrame)
│ ├── local_video_decoder.* MPP 硬解码
│ ├── camera_v4l2.* V4L2 摄像头
│ ├── pipeline_manager.* 管线调度 (双线程)
│ ├── rknn_inference.* NPU 推理 (3核并行)
│ ├── mpp_encoder.* MPP 硬编码
│ ├── rga_processor.* RGA 预处理
│ └── rga_display_converter.* RGA 显示转换
├── logic/ 逻辑引擎
│ ├── logic_types.h 球/轨迹数据结构
│ ├── ball_tracker.* 卡尔曼跟踪
│ ├── scoring_engine.* 计分规则
│ ├── trajectory_predictor.* 球路预测
│ └── logic_manager.* 统一入口
├── ui/
│ └── video_canvas.* QML 画布
└── 3rdparty/rknn/
├── include/rknn_api.h
└── lib/librknnrt.so