一个简单的车辆目标检测和跟踪示例
创作时间:
作者:
@小白创作中心
一个简单的车辆目标检测和跟踪示例
引用
CSDN
1.
https://blog.csdn.net/weixin_38739735/article/details/140789355
本项目旨在通过结合使用YOLOv8m(一种中等复杂度的YOLO变体)、OpenCV(一个开源的计算机视觉库)和SORT算法,实现对视频中特定区域内通过的车辆数量的准确计算。这一过程不仅确保了目标检测的准确性,也提高了整个系统的效率。
项目简介
本项目将使用YOLOv8m(中等版本)、OpenCV和SORT进行目标检测,以确保准确性和效率,来计算通过我们视频中特定区域的车辆数量。
1. 选择一个视频
2. 创建掩膜
为了专注于桥下的车辆,我们将利用画布创建一个掩膜。掩膜是一个二值图像,仅包含黑色(0)和白色(255)两种像素值。在RGB色彩空间中,这对应于:
- 白色(255, 255, 255)表示感兴趣的区域,算法将在这些区域进行处理。
- 黑色(0, 0, 0)表示要忽略或排除在处理之外的区域。
通过按位操作将掩膜与视频结合,我们实现以下结果:
3. 定义一个区域
我们将在视频中定义两个区域:一个用于计算向下行驶的车辆数量,另一个用于计算向上行驶的车辆数量。当在指定区域内识别到车辆时,我们将改变该区域的颜色为绿色,表示检测到车辆。
4. 构建布局
让我们使用cvzone构建计数器的布局。
5. 代码
import cv2
import numpy as np
from ultralytics import YOLO
import cvzone
from sort import sort
class_names = [
'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus', 'train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'stop sign', 'parking meter', 'bench',
'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'backpack', 'umbrella', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis',
'snowboard', 'sports ball', 'kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket', 'bottle', 'wine glass', 'cup', 'fork', 'knife',
'spoon', 'bowl', 'banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza', 'donut', 'cake', 'chair', 'couch', 'potted plant', 'bed',
'dining table', 'toilet', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'book', 'clock',
'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush'
]
class_names_goal = ['car']
model = YOLO('yolov8m.pt')
tracker = sort.Sort(max_age=20)
mask = cv2.imread('mask.png')
video = cv2.VideoCapture('traffic.mp4')
width = 1280
height = 720
line_left_road_x1 = 256
line_left_road_x2 = 500
line_left_road_y = 472
line_right_road_x1 = 672
line_right_road_x2 = 904
line_right_road_y = 472
vehicle_left_road_id_count = []
vehicle_right_road_id_count = []
while True:
success, frame = video.read()
if not success:
break
frame = cv2.resize(frame, (width, height))
image_region = cv2.bitwise_and(frame, mask)
results = model(image_region, stream=True)
detections = []
cv2.line(frame, (line_left_road_x1, line_left_road_y) ,(line_left_road_x2, line_left_road_y), (0, 0, 255))
cv2.line(frame, (line_right_road_x1, line_right_road_y) ,(line_right_road_x2, line_right_road_y), (0, 0, 255))
for result in results:
for box in result.boxes:
class_name = class_names[int(box.cls[0])]
if not class_name in class_names_goal:
continue
confidence = round(float(box.conf[0]) * 100, 2)
if confidence < 30:
continue
x1, y1, x2, y2 = box.xyxy[0]
x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
detections.append([x1, y1, x2, y2, float(box.conf[0])])
tracked_objects = tracker.update(np.array(detections))
for obj in tracked_objects:
x1, y1, x2, y2, obj_id = [int(i) for i in obj]
confidence_pos_x1 = max(0, x1)
confidence_pos_y1 = max(36, y1)
cv2.rectangle(frame, (x1, y1), (x2, y2), (255, 0, 255), 2)
cvzone.putTextRect(frame, f'ID: {obj_id}', (confidence_pos_x1, confidence_pos_y1), 1, 1)
center_x = (x1 + x2) // 2
center_y = (y1 + y2) // 2
if line_left_road_y - 10 < center_y < line_left_road_y + 10 and line_left_road_x1 < center_x < line_left_road_x2:
if not obj_id in vehicle_left_road_id_count:
vehicle_left_road_id_count.append(obj_id)
cv2.line(frame, (line_left_road_x1, line_left_road_y) ,(line_left_road_x2, line_left_road_y), (0, 255, 0), 2)
if line_right_road_y - 10 < center_y < line_right_road_y + 10 and line_right_road_x1 < center_x < line_right_road_x2:
if not obj_id in vehicle_right_road_id_count:
vehicle_right_road_id_count.append(obj_id)
cv2.line(frame, (line_right_road_x1, line_right_road_y) ,(line_right_road_x2, line_right_road_y), (0, 255, 0), 2)
cvzone.putTextRect(frame, f'Car Left Road Count: {len(vehicle_left_road_id_count)}', (50, 50), 2, 2, offset=20, border=2, colorR=(140, 57, 31), colorB=(140, 57, 31))
cvzone.putTextRect(frame, f'Car Right Road Count: {len(vehicle_right_road_id_count)}', (width - 460, 50), 2, 2, offset=20, border=2, colorR=(140, 57, 31), colorB=(140, 57, 31))
cv2.imshow('Image', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
video.release()
cv2.destroyAllWindows()
6. 结果
热门推荐
野狼的生存方式
兰大教授研发高端医疗装备,推动肿瘤精准诊疗国产化
回转窑是干什么用的,看完你就知道
回转窑石灰窑的废弃物处理与资源化利用
从美妆到时尚文旅、健康教育,“她经济”驱动产业变革创新
《魔兽世界》石头汤配方获得方法
大额存单质押的流程
2025年腻子粉行业市场发展分析及供需格局预测
保证书是否具有法律效力?一文带你了解!
显卡故障检查排除方法有哪些
怎么把苹果运营商信号改成数字?
基层女性在工作中有哪些优势?
正山小种的基本介绍
正山小种的基本介绍
如何实现公平合理的团队分工?
抛物线方程在笛卡尔坐标系中的奥秘:公式、性质、应用
抛物线顶点坐标公式解读:从此告别难题!
前驱、后驱、四驱怎么选?前桥后桥如何影响驾驶体验
身份证照片格式管理指南:从选择到存储的全方位指导
急性湿疹可以吃什么
数据库系统原理实验教程:从概念到实践
骨折工傷賠償指南:香港僱員必知的申請流程與金額計算
工伤认定的3类核心证据
中国科学家报道锂硫电池多相反应热力学规律研究
《珠郎娘美》:侗族传统口述文学的代表作
导致猫传腹的原因有哪些
如何在Windows 11中管理启动项
童年智识的萌芽与成长:解读6~12岁孩子的成长规律
人力资源会计下企业薪酬体系设计及应用
项目管理问题描述怎么写