360° 车载全景视觉与数据传输系统 — Windows Qt 客户端
基于车载物联网机器视觉的智能驾驶辅助系统。实现四路鱼眼全景拼接、YOLOv4 目标检测、TCP 可靠通信、多媒体视频管理等核心功能。
- 行车模式:摄像头实时采集 + Canny 边缘检测
- 倒车模式:Homography 透视投影轨迹线叠加,键盘方向键控制转向角度,红黄绿三区距离标尺
- 鸟瞰模式:单路视频实时逆透视变换为 2D 俯视图,原始/俯视双视图联动对比
- WoodScape 多项式畸变模型(rho = k1θ + k2θ² + k3θ³ + k4θ⁴)鱼眼矫正
- 相机外参(四元数旋转 + 平移向量)驱动的 3D 反向射线投射
- Alpha 羽化融合掩膜消除拼接接缝
- 独立外参微调窗口,12 滑块实时调节 Pitch / Yaw / Roll
- YOLOv4 / YOLOv4-tiny 预训练模型加载(OpenCV DNN)
- 车辆检测(绿框)、红绿灯检测(黄框)、行人检测(蓝框)
- 置信度阈值可调,实时类别标注
- 自定义二进制协议:type(4B) + length(4B) + payload(NB),小端序
- 4 种消息类型:Text / ACK / Reliable / Telemetry
- 粘包/半包状态机解析
- ACK 确认 + 超时重传(最多 3 次)
- 离线缓冲队列(断网缓存、重连补发)
- QTimer 自动遥测上报(每 10 秒 JSON)
- 提供 WSL Ubuntu Python 测试服务端(echoserver.py)
- Modern Dark Dashboard 深色主题
- 7 页 StackedWidget 导航
- 视频回放:播放/暂停、进度条拖拽跳帧、0.5x~2x 倍速
- 断点续播:播放位置持久化到 MySQL,重开弹窗续播
- 画廊页:QListWidget IconMode 缩略图网格,视频/图片分类筛选
- 截图保存:摄像头与回放画面一键截图,PNG + MySQL 元数据入库
- 独立播放弹窗(QDialog)
- 行车数据模拟看板(车速、电量、包统计)
| 层级 | 技术 |
|---|---|
| 语言 | C++17 |
| UI 框架 | Qt 6.11 (Widgets / Network / Sql) |
| 计算机视觉 | OpenCV 4.x (DNN / imgproc / calib3d) |
| 深度学习 | YOLOv4 (Darknet → OpenCV DNN) |
| 数据库 | MySQL 8.0 (QODBC 桥接) |
| 通信 | TCP/IP 自定义二进制协议 |
| 构建 | CMake 3.19+ / MSVC 2022 / Ninja |
| 测试 | WSL Ubuntu + Python echoserver.py |
SmartDrivingClient/
├── main.cpp # 入口
├── mainwindow.h/.cpp # 主窗口控制器 (MVC-Controller)
├── mainwindow.ui # Qt Designer XML 布局
├── databasemanager.h/.cpp # MySQL 数据访问层 (MVC-Model)
├── tcpmanager.h/.cpp # TCP 可靠通信层 (MVC-Model)
├── videothread.h/.cpp # 摄像头采集 + Canny 边缘检测
├── playbackthread.h/.cpp # 视频回放线程
├── reversethread.h/.cpp # 倒车轨迹线线程
├── birdeyethread.h/.cpp # 鸟瞰透视变换线程
├── detectionthread.h/.cpp # YOLO 目标检测线程
├── panoramathread.h/.cpp # 四路鱼眼全景拼接线程
├── playbackwindow.h/.cpp # 独立播放弹窗
├── tunewindow.h/.cpp # 外参微调窗口
├── echoserver.py # WSL TCP 测试服务端
├── CMakeLists.txt # CMake 构建配置
├── FV/ # 前视摄像头图片(本地素材)
├── RV/ # 后视摄像头图片
├── MVL/ # 左后视镜图片
├── MVR/ # 右后视镜图片
├── images/ # 界面图标
├── videos/ # 测试视频
├── snapshots/ # 截图保存
└── models/ # YOLO 模型文件
作为应用的主入口页面,展示所有截图和视频记录的缩略图网格。
- QListWidget + IconMode 实现 Windows 资源管理器式缩略图网格
- 视频缩略图自动提取第一帧画面(OpenCV
cv::VideoCapture),图片直接用原图缩放 - 顶部「视频」「图片」双按钮互斥筛选,支持按文件类型过滤
- 双击视频缩略图 → 自动切换到回放页并开始播放,支持断点续播弹窗
- 双击图片缩略图 → 弹出独立深色图片查看器(QDialog)
- 每次加载时自动遍历数据库记录,
QFileInfo::exists()校验文件是否仍存在于磁盘,失效记录自动 DELETE - 数据库记录通过截图功能和视频播放功能自动写入,无需手动导入
- 单例刷新:每次切回相册页重新加载数据
完整的本地视频播放器,支持播放控制、进度交互、倍速切换。
- PlaybackThread 独立线程逐帧解码,
QWaitCondition实现暂停/恢复零延迟响应 - 进度条
QSlider拖动 →seekPosition()→cv::CAP_PROP_POS_FRAMES精确跳帧 - 倍速按钮循环切换 0.5x → 1x → 1.5x → 2x,
delayMs / m_speed线程安全 - 断点续播:停止播放时
last_position写入 MySQL,重新打开同一视频时QMessageBox弹窗询问是否从上次位置继续 - 截图按钮:抓取当前帧
QPixmap→ 保存 PNG 到snapshots/→ 元数据写入数据库 - 「独立窗口」按钮弹出
PlaybackWindowQDialog,与主窗口共享同一PlaybackThread,画面和进度实时同步
三种视觉模式复用同一页面,通过侧边栏按钮切换。
- 行车模式:
VideoThread打开笔记本摄像头,实时显示彩色原始画面(可切换 Canny 边缘检测),30fps - 倒车模式:
ReverseThread播放本地倒车视频,Homography 透视变换将鸟瞰轨迹线投影到画面,← → ↓ 方向键实时调节转向角,红黄绿三区距离标尺(0.5m / 1m / 2m) - AI 检测:
DetectionThread加载 YOLOv4 模型,对视频逐帧推理,绿色框标注车辆、黄色框标注红绿灯、蓝色框标注行人,动态时钟标签实时显示当前检测目标数 - 动态系统时钟
QTimer每秒刷新,页面底部四张数据卡片(车速/电量/包统计/连接状态),行车模式下自动生成模拟数据并通过 TCP 可靠通道上报
四路鱼眼摄像头的完整全景拼接管线。
- 左侧 2×2 格栅显示 FV(前视)、RV(后视)、MVL(左镜)、MVR(右镜)四路原始画面
- 右侧大画布显示拼接后的 640×640 鸟瞰全景图
- 鱼眼矫正:WoodScape 多项式模型
rho = k1θ + k2θ² + k3θ³ + k4θ⁴,逐像素构建 remap 查找表 - 3D 射线投射:利用相机外参(四元数旋转矩阵 + 平移向量)将每个 BEV 像素反向投影到世界坐标系,再由各路相机投影回图像坐标系采样
- Alpha 羽化融合:预计算四路评分掩膜(沿对角线自然渐变),浮点数加权累加,消除拼接接缝
- 「全景拼接」按钮启动鸟瞰输出,「鱼眼矫正」按钮切换矫正/原始,「停止/继续」控制播放
- 外参微调:独立
TuneWindow弹窗,4 路 × 3 轴 = 12 滑块,实时调节 Pitch/Yaw/Roll 欧拉角,R_delta * R_base注入射线投射,暂停时也能即时刷新
独立的参数标定弹窗,与全景拼接页面配合使用,实时调整各摄像头的欧拉角。
- TuneWindow(QDialog)独立弹出,可与主窗口并排显示,调参时全景画面即时刷新
- 4 路摄像头(FV / RV / MVL / MVR)× 3 轴(Pitch / Yaw / Roll)= 12 个 QSlider
- 滑块范围 -15.0° ~ +15.0°,精度 0.1°,实时数值标签同步显示
- 每次滑块变动调用
PanoramaThread::setDeltaAngle(),设置m_refreshReq标志 - 欧拉角 → 旋转矩阵:
getDeltaRotationMatrix(pitch, yaw, roll)计算R = Rz(roll) * Ry(yaw) * Rx(pitch) - 在
buildBEVRemap中注入R_delta * R_base,微调角叠加到相机外参旋转矩阵 - 暂停状态下拖动滑块会触发
needRefresh机制:重建 remap → 用当前帧重新渲染,帧号不递增,松开后恢复暂停 - 「重新计算 Remap」按钮手动触发刷新,「重置」按钮一键归零所有滑块
- 通过侧边栏「外参微调」打开,关闭时自动清理指针
通信测试与协议验证面板。
- IP/端口同行输入,一键连接
127.0.0.1:12345 - 发送内容通过
sendReliable()可靠通道传输,textEditLog实时显示 ACK 确认、重传、丢包日志 - 终端风格黑底绿字日志区(QSS 定制)
- WSL Ubuntu 运行
echoserver.py即可配合测试
View: mainwindow.ui (Qt Designer XML, UIC 自动生成)
↓ connectSlotsByName
Controller: MainWindow (信号槽调度,不写 SQL,不操作 Socket)
↓ 委托
Model: DatabaseManager (MySQL CRUD + 断点续播)
TcpManager (TCP 通信 + ACK + 重传 + 缓冲)
- Windows 11
- Qt 6.11.1 MSVC2022 64-bit
- OpenCV 4.x(含 DNN 模块,路径
E:/opencv/opencv/build/x64/vc16/lib) - MySQL 8.0 + MySQL Connector/ODBC 9.7 64-bit
- CMake 3.19+
- WSL Ubuntu(用于测试 TCP 通信)
- 用 Qt Creator 打开
CMakeLists.txt - Build → Run CMake
Ctrl+B编译Ctrl+R运行
确保 MySQL 运行且有 smart_driving_db 数据库:
CREATE DATABASE IF NOT EXISTS smart_driving_db;修改 databasemanager.cpp 中的连接密码:
"PASSWORD=your_password;"下载模型文件放入 models/ 目录:
models/
├── yolov4.cfg # 网络配置
├── yolov4.weights # 预训练权重 (246MB)
└── coco.names # 类别名称
下载地址:https://github.com/AlexeyAB/darknet/releases
WSL Ubuntu 中启动测试服务端:
python3 echoserver.pyQt 客户端 Debug 页连接 127.0.0.1:12345。
| Byte | Field | Type | Description |
|---|---|---|---|
| 0-3 | type | uint32 LE | 1=Text, 2=ACK, 3=Reliable, 4=Telemetry |
| 4-7 | length | uint32 LE | Payload size |
| 8+ | payload | raw | type=1: UTF-8, type=2: seq(4B), type=3/4: seq(4B)+data |
MIT License