Skip to content

donazyd888/SmartDrivingClient

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SmartDrivingClient

360° 车载全景视觉与数据传输系统 — Windows Qt 客户端

License Qt OpenCV

基于车载物联网机器视觉的智能驾驶辅助系统。实现四路鱼眼全景拼接、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)

多媒体 UI

  • 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
  • 数据库记录通过截图功能和视频播放功能自动写入,无需手动导入
  • 单例刷新:每次切回相册页重新加载数据
image

视频回放页

完整的本地视频播放器,支持播放控制、进度交互、倍速切换。

  • 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/ → 元数据写入数据库
  • 「独立窗口」按钮弹出 PlaybackWindow QDialog,与主窗口共享同一 PlaybackThread,画面和进度实时同步
image

摄像头页(行车/倒车/检测)

三种视觉模式复用同一页面,通过侧边栏按钮切换。

  • 行车模式VideoThread 打开笔记本摄像头,实时显示彩色原始画面(可切换 Canny 边缘检测),30fps
  • 倒车模式ReverseThread 播放本地倒车视频,Homography 透视变换将鸟瞰轨迹线投影到画面,← → ↓ 方向键实时调节转向角,红黄绿三区距离标尺(0.5m / 1m / 2m)
  • AI 检测DetectionThread 加载 YOLOv4 模型,对视频逐帧推理,绿色框标注车辆、黄色框标注红绿灯、蓝色框标注行人,动态时钟标签实时显示当前检测目标数
  • 动态系统时钟 QTimer 每秒刷新,页面底部四张数据卡片(车速/电量/包统计/连接状态),行车模式下自动生成模拟数据并通过 TCP 可靠通道上报
image

四路全景拼接页

四路鱼眼摄像头的完整全景拼接管线。

  • 左侧 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 注入射线投射,暂停时也能即时刷新
image

外参微调窗口

独立的参数标定弹窗,与全景拼接页面配合使用,实时调整各摄像头的欧拉角。

  • 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」按钮手动触发刷新,「重置」按钮一键归零所有滑块
  • 通过侧边栏「外参微调」打开,关闭时自动清理指针
image

TCP 调试页

通信测试与协议验证面板。

  • IP/端口同行输入,一键连接 127.0.0.1:12345
  • 发送内容通过 sendReliable() 可靠通道传输,textEditLog 实时显示 ACK 确认、重传、丢包日志
  • 终端风格黑底绿字日志区(QSS 定制)
  • WSL Ubuntu 运行 echoserver.py 即可配合测试
image

MVC 架构

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 通信)

构建

  1. 用 Qt Creator 打开 CMakeLists.txt
  2. Build → Run CMake
  3. Ctrl+B 编译
  4. Ctrl+R 运行

数据库配置

确保 MySQL 运行且有 smart_driving_db 数据库:

CREATE DATABASE IF NOT EXISTS smart_driving_db;

修改 databasemanager.cpp 中的连接密码:

"PASSWORD=your_password;"

YOLO 模型配置

下载模型文件放入 models/ 目录:

models/
├── yolov4.cfg          # 网络配置
├── yolov4.weights      # 预训练权重 (246MB)
└── coco.names          # 类别名称

下载地址:https://github.com/AlexeyAB/darknet/releases

TCP 测试

WSL Ubuntu 中启动测试服务端:

python3 echoserver.py

Qt 客户端 Debug 页连接 127.0.0.1:12345


TCP 协议

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

About

Linux下360°车载全景视觉与数据传输系统

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors