操作系统:window、Ubuntu下均可,本文中演示的是在win11系统下。
软件准备:anaconda,没装的请自行安装。
本项目调用官方开源yolov8模型实现本地摄像头及视频的检测,详细模型调用方法等请参考官方文档及官方GitHub项目。
conda create -n yolo python=3.8
conda activate yolo
最前面会出现当前python环境名称
pip install ultralytics
会顺带一起安装很多包,包括pytorch,opencv等。
下载的pytorch是cpu版本的,可以自行下载gpu版本的,检测速度应该会更快。
官方文档相关内容:
YOLOv8 可以在命令行界面(CLI)中直接使用,只需输入 yolo
命令:
yolo predict model=yolov8n.pt source='https://ultralytics.com/images/bus.jpg'
yolo
可用于各种任务和模式,并接受其他参数,例如 imgsz=640
。查看 YOLOv8 CLI 文档以获取示例。
我使用位于C:\Users\10925\Pictures\1.jpg
的图片直接在命令行进行演示
他首先会下载yolo模型的权重文件yolov8.pt
,并保存在当前文件夹下。建议每次使用yolo时都在该文件夹下打开,不然每次都会重新下载一次权重文件。
显示处理完成的结果保存在runs\detect\predict
,这个也是在当前文件夹下创建的
处理方式:持续从本地摄像头捕获帧并使用yolo对每一帧进行处理
这种情况下如果同时设置save = True
只会保存目前处理的最后一帧的检测图,如果想保存成视频的参考接下来的方法2.
(注:如果单纯输入的source是视频文件的话,设置save = True
可以保存完整处理完毕视频)
import cv2
from ultralytics import YOLO
# 加载 YOLOv8 模型
model = YOLO("yolov8n.pt")
# 获取摄像头内容,参数 0 表示使用默认的摄像头
cap = cv2.VideoCapture(0)
while cap.isOpened():
success, frame = cap.read() # 读取摄像头的一帧图像
if success:
model.predict(source=frame, show=True) # 对当前帧进行目标检测并显示结果
# 通过按下 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release() # 释放摄像头资源
cv2.destroyAllWindows() # 关闭OpenCV窗口
可以自行修改代码设置保存检测结果视频的尺寸、时间长度等。
import cv2
from ultralytics import YOLO
# 载入 YOLOv8 模型
model = YOLO('yolov8n.pt')
# 获取摄像头内容
cap = cv2.VideoCapture(0)
# 获取原视频的宽度和高度
original_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
original_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 设置新的视频帧大小
new_width = 1280
new_height = 720
# 设置保存视频的文件名、编解码器和帧速率
output_path = "output_video.avi" # 替换为你的输出视频文件路径
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(output_path, fourcc, 20.0, (original_width, original_height))
# 循环遍历视频帧
while cap.isOpened():
# 从视频中读取一帧
success, frame = cap.read()
if success:
# 对帧运行 YOLOv8 推理
results = model(frame)
# 在帧上可视化结果
annotated_frame = results[0].plot()
# 显示带有标注的帧
cv2.imshow("YOLOv8 推理", annotated_frame)
# 将帧写入输出视频
out.write(frame)
# 如果按下 'q' 键,则中断循环
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# 如果达到视频结尾,中断循环
break
# 释放视频捕获对象并关闭显示窗口
cap.release()
cv2.destroyAllWindows()
out.release()
可以自己设置检测框以及检测标签的样式,相关模型返回数据及处理方式请参考官方文档
import cv2
from ultralytics import YOLO
# 加载 YOLOv8 模型
model = YOLO("yolov8n.pt")
# 获取摄像头内容
cap = cv2.VideoCapture(0)
# 获取视频内容
# video_path = "1.mp4" # 替换为你的视频文件路径
# cap = cv2.VideoCapture(video_path)
# 获取原视频的大小
# original_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
# original_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 设置新的视频帧大小
# new_width = 1280
# new_height = 720
# 设置保存视频的文件名、编解码器和帧速率
# output_path = "output_video.avi" # 替换为你的输出视频文件路径
# fourcc = cv2.VideoWriter_fourcc(*'XVID')
# out = cv2.VideoWriter(output_path, fourcc, 20.0, (original_width, original_height))
while True:
ret, frame = cap.read()
if not ret:
break
# 调整帧的大小
# frame = cv2.resize(frame, (new_width, new_height))
# 使用模型进行目标检测,并返回相应数据
results_list = model.predict(source=frame)
# 获取每个结果对象并进行处理
for results in results_list:
if results.boxes is not None:
xyxy_boxes = results.boxes.xyxy
conf_scores = results.boxes.conf
cls_ids = results.boxes.cls
for box, conf, cls_id in zip(xyxy_boxes, conf_scores, cls_ids):
x1, y1, x2, y2 = map(int, box)
cls_id = int(cls_id)
label = model.names[cls_id]
confidence = f"{conf:.2f}"
# 颜色
rectangle_color = (0, 255, 0)
label_color = (0, 0, 255)
# 在图像上绘制矩形框和标签
cv2.rectangle(frame, (x1, y1), (x2, y2), rectangle_color, 2)
cv2.putText(frame, f"{label} {confidence}", (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, label_color,2)
# 显示图像
cv2.imshow('YOLOv8 Real-time Detection', frame)
# 将帧写入输出视频
# out.write(frame)
# 如果按下 'q' 键,则中断循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放视频文件和输出视频
cap.release()
cv2.destroyAllWindows()
# out.release()
yolov8官方文档
yolov8官方GitHub项目