YOLO Vision Code
YOLO 无界面人体检测:自动录像保存
检测到人体时自动开始录制视频,目标消失一段时间后自动停止,适合无人机巡检记录。
这些脚本用于 DRF450 或机载计算机上的 OpenCV + YOLOv8 视觉识别测试。建议先在桌面或树莓派本地验证摄像头索引、模型路径和性能,再把检测结果接入 MAVLink、自主飞行或任务触发逻辑。
脚本目标
后台检测 person 类别,首次检测到目标时创建 MP4 文件,目标消失超过 5 秒后停止录像。
运行依赖: Python、OpenCV、Ultralytics YOLO。检测脚本默认模型路径为
/home/drobotics/yolov8n.pt,部署时请确认模型文件存在。学习重点
- 只在检测到人时保存视频,节省存储空间
- 适合无人机巡检、安全观察和行为片段记录
- NO_DETECT_TIMEOUT 控制停止录像的延迟时间
关键参数
| 参数 | 当前设置 |
|---|---|
CAMERA_INDEX | 0 |
CONF_THRESHOLD | 0.5 |
FRAME_WIDTH | 640 |
FRAME_HEIGHT | 360 |
FRAME_SKIP | 2 |
SAVE_DIR | "video_detections" |
NO_DETECT_TIMEOUT | 5 # seconds |
PERSON_CLASS_ID | 0 |
运行前检查
- 安装依赖:
pip install opencv-python ultralytics - 确认摄像头编号,必要时修改
CAMERA_INDEX或CAMERA_INDEXES。 - 确认 YOLO 模型路径,例如
/home/drobotics/yolov8n.pt。 - 在无人机上运行前,先单独验证摄像头、推理速度、保存路径和散热。
完整代码:yolo_video_headless.py
import cv2
import time
import os
from datetime import datetime
from ultralytics import YOLO
# =========================
# SETTINGS
# =========================
CAMERA_INDEX = 0
CONF_THRESHOLD = 0.5
FRAME_WIDTH = 640
FRAME_HEIGHT = 360
FRAME_SKIP = 2
SAVE_DIR = "video_detections"
NO_DETECT_TIMEOUT = 5 # seconds
# =========================
# INIT
# =========================
os.makedirs(SAVE_DIR, exist_ok=True)
print(" Loading YOLOv8...")
model = YOLO("/home/drobotics/yolov8n.pt")
PERSON_CLASS_ID = 0
cap = cv2.VideoCapture(CAMERA_INDEX)
if not cap.isOpened():
print(" Camera not opened")
exit()
print(" Headless video detection started")
# =========================
# VIDEO STATE
# =========================
recording = False
video_writer = None
last_detection_time = 0
counter = 0
# =========================
# MAIN LOOP
# =========================
while True:
ret, frame = cap.read()
if not ret:
print(" Frame error")
break
frame = cv2.resize(frame, (FRAME_WIDTH, FRAME_HEIGHT))
counter += 1
if counter % FRAME_SKIP != 0:
continue
results = model(frame, imgsz=320, verbose=False)[0]
person_detected = False
# =========================
# DETECTION LOOP
# =========================
for box in results.boxes:
cls_id = int(box.cls[0])
conf = float(box.conf[0])
if cls_id == PERSON_CLASS_ID and conf > CONF_THRESHOLD:
person_detected = True
break
# =========================
# START RECORDING
# =========================
if person_detected:
last_detection_time = time.time()
if not recording:
timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
filename = os.path.join(SAVE_DIR, f"person_{timestamp}.mp4")
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
video_writer = cv2.VideoWriter(filename, fourcc, 20.0,
(FRAME_WIDTH, FRAME_HEIGHT))
recording = True
print(f" START recording: {filename}")
# =========================
# WRITE VIDEO FRAME
# =========================
if recording:
video_writer.write(frame)
# stop if no detection for some time
if time.time() - last_detection_time > NO_DETECT_TIMEOUT:
print(" STOP recording (no detection)")
recording = False
video_writer.release()
video_writer = None
# =========================
# CLEANUP
# =========================
cap.release()
if video_writer:
video_writer.release()
print(" Stopped cleanly")
下一步
先完成摄像头采集,再运行实时检测或无界面检测。后续可以把人体检测结果接入 MAVLink 任务逻辑,实现识别触发、悬停、返航、录像或地面站告警。