智慧交通项目:Python+PySide6 车辆检测系统 YOLOv8+OpenCV 自定义视频 自定义检测区域 (源码+文档)✅

博主介绍:✌全网粉丝50W+,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,选择我们,就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

1、2026年计算机专业毕业设计选题大全(建议收藏)✅

2、大数据、计算机专业选题(Python/Java/大数据/深度学习/机器学习)(建议收藏)✅

1、项目介绍

  • 技术栈:PySide6、OpenCV和YOLOv8实时车速检测+车辆检测跟踪
  • 这个项目的研究背景:当前交通监控场景中,传统车速检测与车辆跟踪多依赖人工或单一设备,存在实时性差、检测精度低、区域灵活性不足的问题。人工监控难以应对高频车流的实时数据记录,传统设备固定检测区域无法灵活适配不同路段,且易受环境干扰导致数据偏差,这些痛点制约了交通管控的效率与精准度,无法满足智慧交通对实时、灵活、准确检测的需求。
  • 这个项目的研究意义:技术层面,通过YOLOv8实现高精度车辆检测,结合OpenCV完成视频处理与区域划定,依托PySide6提供可视化操作支撑,解决传统检测的技术局限;用户层面,支持自定义替换检测视频与调整检测区域,满足不同场景下的检测需求,提升使用灵活性;行业层面,为交通监控、道路管控等领域提供低成本、高适配性的实时检测方案,助力智慧交通场景的落地,具备实际应用价值。

2、项目界面

(1)车速检测车辆检测跟踪1

(2)车速检测车辆检测跟踪2

(3)车速检测车辆检测跟踪3

3、项目说明

本项目是基于Python 3.8环境开发的实时车速检测与车辆跟踪系统,整合PySide6、OpenCV与YOLOv8技术,核心实现车辆检测、跟踪及车速计算功能,旨在解决传统交通检测场景中灵活性不足、适配性低的问题。项目启动方式简单,用户仅需运行test.py文件即可开启功能,无需复杂配置。在视频源选择上,系统支持自定义替换检测视频,具体可修改test.py第22行代码"cap = cv2.VideoCapture('Vid1.mp4')",将括号内的视频文件名替换为目标视频路径,即可实现对不同场景视频的检测。检测区域设置同样具备高灵活性,在test.py第31行定义了初始检测区域"area = [(225, 335), (803, 335), (962, 408), (57, 408)]",该区域通过多边形顶点坐标列表表示,用户可根据实际需求调整坐标点数量与数值:若需矩形区域,可按"[(x1, y1), (x2, y1), (x2, y2), (x1, y2)]"的格式定义四个顶点;若需不规则区域,可增加坐标点并按顺时针或逆时针顺序排列,系统会通过cv2.polylines()函数将定义的检测区域绘制在视频帧上,当检测到车辆进入该区域时,自动触发后续的车速计算与跟踪处理。在核心技术逻辑上,YOLOv8算法负责对视频帧中的车辆进行高精度检测,获取车辆位置与轮廓信息;OpenCV负责视频读取、帧处理及检测区域绘制,同时结合车辆在检测区域内的运动轨迹计算车速;PySide6则为系统提供可视化界面支撑,确保检测结果与操作界面的直观呈现。整体而言,系统兼顾易用性与灵活性,既适用于交通监控相关的学习与研究场景,也可作为基础框架拓展至更多车辆检测相关的实际应用中,具备较强的实用性与可扩展性。

4、核心代码

python 复制代码
import cv2
import time
import numpy as np
from tracker import *
import pandas as pd
from ultralytics import YOLO


# 加载模型
model = YOLO('yolov8s.pt')


def RGB(event, x, y, flags, param):
    if event == cv2.EVENT_MOUSEMOVE:
        colorsBGR = [x, y]
        print(colorsBGR)


cv2.namedWindow('RGB')
cv2.setMouseCallback('RGB', RGB)

cap = cv2.VideoCapture('Vid2.mp4')     # 选择需要检测的视频

my_file = open("coco.txt", "r")
data = my_file.read()
class_list = data.split("\n")
# print(class_list)

count = 0
speed = {}
area = [(225, 335), (803, 335), (962, 408), (57, 408)]
area_c = set()
# 跟踪算法
tracker = Tracker()
speed_limit = 62

while True:
    ret, frame = cap.read()
    if not ret:
        break
    count += 1
    if count % 3 != 0:
        continue
    frame = cv2.resize(frame, (1020, 500))

    results = model.predict(frame)
    # print(results)
    a = results[0].boxes.boxes
    px = pd.DataFrame(a).astype("float")
    # print(px)
    list = []

    # 使用YOLOv8的检测结果, 进行算法设计
    for index, row in px.iterrows():
        # print(row)

        x1 = int(row[0])
        y1 = int(row[1])
        x2 = int(row[2])
        y2 = int(row[3])
        d = int(row[5])
        c = class_list[d]
        if 'car' in c:
            list.append([x1, y1, x2, y2])
    bbox_id = tracker.update(list)
    for bbox in bbox_id:
        x3, y3, x4, y4, id = bbox
        cx = int(x3+x4)//2
        cy = int(y3+y4)//2
        results = cv2.pointPolygonTest(
            np.array(area, np.int32), ((cx, cy)), False)

        if results >= 0:
            cv2.circle(frame, (cx, cy), 4, (0, 0, 255), -1)
            cv2.putText(frame, str(id), (x3, y3), cv2.FONT_HERSHEY_COMPLEX,
                        0.8, (0, 255, 255), 2, cv2.LINE_AA)
            cv2.rectangle(frame, (x3, y3), (x4, y4), (0, 0, 255), 2)
            area_c.add(id)
            now = time.time()
            if id not in speed:
                speed[id] = now
            else:
                try:
                    prev_time = speed[id]
                    speed[id] = now
                    dist = 2
                    a_speed_ms = dist / (now - prev_time)
                    a_speed_kh = a_speed_ms * 3.6
                    cv2.putText(frame, str(int(a_speed_kh))+'Km/h', (x4, y4),
                                cv2.FONT_HERSHEY_COMPLEX, 0.8, (0, 255, 255), 2, cv2.LINE_AA)
                    speed[id] = now
                except ZeroDivisionError:
                    pass

                # 检查速度是否超过速度限制
                # if a_speed_kh >= speed_limit:
                #     # Display a warning message
                #     cv2.putText(frame, "Speed limit violated!", (440, 115),
                #                 cv2.FONT_HERSHEY_TRIPLEX, 0.8, (255, 0, 255), 2, cv2.LINE_AA)
                #     # Display the message for 3 seconds
                #     start_time = time.time()
                #     while time.time() - start_time < 3:
                #         cv2.imshow("RGB", frame)
                #         if cv2.waitKey(1) & 0xFF == 27:
                #             break

    cv2.polylines(frame, [np.array(area, np.int32)], True, (0, 255, 0), 2)
    cnt = len(area_c)
    cv2.putText(frame, ('Vehicle-Count:-')+str(cnt), (452, 50),
                cv2.FONT_HERSHEY_TRIPLEX, 1, (102, 0, 255), 2, cv2.LINE_AA)

    cv2.imshow("RGB", frame)
    if cv2.waitKey(1) & 0xFF == 27:
        break

# 刷新,释放资源
cap.release()
cv2.destroyAllWindows()

import math


class Tracker:
    def __init__(self):
        # 存储目标的中心位置
        self.center_points = {}
        # ID计数
        # 每当检测到一个新的目标id时, 计数将增加1
        self.id_count = 0

    def update(self, objects_rect):
        # 目标的方框和ID
        objects_bbs_ids = []

        # 获取新目标的中心点
        for rect in objects_rect:
            x, y, w, h = rect
            cx = (x + x + w) // 2
            cy = (y + y + h) // 2

            # 看看这个目标是否已经被检测到过
            same_object_detected = False
            for id, pt in self.center_points.items():
                dist = math.hypot(cx - pt[0], cy - pt[1])

                if dist < 35:
                    self.center_points[id] = (cx, cy)
                    # print(self.center_points)
                    objects_bbs_ids.append([x, y, w, h, id])
                    same_object_detected = True
                    break

            # 检测到新目标,分配ID给新目标
            if same_object_detected is False:
                self.center_points[self.id_count] = (cx, cy)
                objects_bbs_ids.append([x, y, w, h, self.id_count])
                self.id_count += 1

        # 按中心点清理字典, 删除不再使用的ID
        new_center_points = {}
        for obj_bb_id in objects_bbs_ids:
            _, _, _, _, object_id = obj_bb_id
            center = self.center_points[object_id]
            new_center_points[object_id] = center

        # 更新字典, 删除未使用的ID
        self.center_points = new_center_points.copy()
        return objects_bbs_ids

🍅✌**感兴趣的可以先收藏起来,点赞关注不迷路,想学习更多项目可以查看主页,大家在毕设选题,项目编程以及论文编写等相关问题都可以给我留言咨询,希望可以帮助同学们顺利毕业!**🍅✌

5、源码获取方式

🍅**由于篇幅限制,获取完整文章或源码、代做项目的,拉到文章底部即可看到个人联系方式。**🍅

点赞、收藏、关注,不迷路,下方查看 👇🏻获取联系方式👇🏻

相关推荐
java1234_小锋3 小时前
TensorFlow2 Python深度学习 - 深度学习概述
python·深度学习·tensorflow·tensorflow2·python深度学习
数据与人工智能律师3 小时前
AI的法治迷宫:技术层、模型层、应用层的法律痛点
大数据·网络·人工智能·云计算·区块链
迈火4 小时前
PuLID_ComfyUI:ComfyUI中的图像生成强化插件
开发语言·人工智能·python·深度学习·计算机视觉·stable diffusion·语音识别
浔川python社6 小时前
《网络爬虫技术规范与应用指南系列》(xc—5)完
爬虫·python
MongoVIP6 小时前
Scrapy爬虫实战:正则高效解析豆瓣电影
python·scrapy
李小白667 小时前
Python文件操作
开发语言·python
weixin_525936337 小时前
金融大数据处理与分析
hadoop·python·hdfs·金融·数据分析·spark·matplotlib
Zwb2997928 小时前
Day 30 - 错误、异常与 JSON 数据 - Python学习笔记
笔记·python·学习·json
码界筑梦坊8 小时前
206-基于深度学习的胸部CT肺癌诊断项目的设计与实现
人工智能·python·深度学习·flask·毕业设计