一个简单的车辆目标检测和跟踪示例
创作时间:
作者:
@小白创作中心
一个简单的车辆目标检测和跟踪示例
引用
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. 结果
热门推荐
毛主席的诗《七律•长征》生动再现了红军长征艰苦光辉的战斗历程
《国门之外》米开朗基罗和他的《大卫》
旅顺横山街租房攻略:松苑新村优质房源推荐
湖南妇女儿童医院专家详解:如何调理“上热下寒”体质
六周胎儿心脏启动,六大禁忌守护健康发育
青少年网球训练,全面提升体质与心理韧性
盆栽的选择很重要的
机头水使用指南:高效清洁不伤手,4步掌握正确使用法
炮二平五开局,新手也能赢大师?
琼瑶作词的经典歌曲盘点,品味浪漫爱情小说缔造者的音乐魅力!
三步完成山东航空退票,手续费标准及防诈骗提醒
高精度模具加工技术在机械制造中的应用
中国银行教你如何轻松兑换泰铢
小户型收纳神器:多功能榻榻米床
蚕豆:承载孝道文化,富含营养价值,但这些人不宜食用
低空经济浪潮下:无人机培训机构的机遇与甄别!申请无人机驾照培训机构保姆级教程
世界强化免疫日 | 加强免疫力记住6个关键点
世界第二大桌山瓦屋山:72瀑80泉,四季皆美景
绿竹米 vs 大米:谁才是餐桌上的营养之王?
从甲骨文看“云”字:从天象描绘到文化符号的演变
陆一峰揭秘大乐透最新预测趋势
80%青年恐惧死亡,五大哲学家教你正确看待生死
解密日本丧葬习俗:守夜、告别、火葬背后的仪式感
三叉神经痛:从发病机制到治疗管理的科学指南
2024年高空作业证办理指南:从报名到领证全攻略
展望2025,2024年新材料产业现状与发展趋势解读
秋游千岛湖:一条让你流连忘返的自驾路线
云南楚雄必打卡:万德湖景区
鄂托克前旗保姆级旅游攻略:自然风光、红色旅游与地道美食全攻略
梨状肌综合征:脚软无力的罪魁祸首?