Drobotics logo DROBOTICSTechnical Library

Drone Guide

YOLO 无界面人体检测:自动录像保存

All Drone

YOLO Vision Code

YOLO 无界面人体检测:自动录像保存

检测到人体时自动开始录制视频,目标消失一段时间后自动停止,适合无人机巡检记录。

这些脚本用于 DRF450 或机载计算机上的 OpenCV + YOLOv8 视觉识别测试。建议先在桌面或树莓派本地验证摄像头索引、模型路径和性能,再把检测结果接入 MAVLink、自主飞行或任务触发逻辑。

脚本目标

后台检测 person 类别,首次检测到目标时创建 MP4 文件,目标消失超过 5 秒后停止录像。

运行依赖: Python、OpenCV、Ultralytics YOLO。检测脚本默认模型路径为 /home/drobotics/yolov8n.pt,部署时请确认模型文件存在。

学习重点

  • 只在检测到人时保存视频,节省存储空间
  • 适合无人机巡检、安全观察和行为片段记录
  • NO_DETECT_TIMEOUT 控制停止录像的延迟时间

关键参数

参数当前设置
CAMERA_INDEX0
CONF_THRESHOLD0.5
FRAME_WIDTH640
FRAME_HEIGHT360
FRAME_SKIP2
SAVE_DIR"video_detections"
NO_DETECT_TIMEOUT5 # seconds
PERSON_CLASS_ID0

运行前检查

  1. 安装依赖:pip install opencv-python ultralytics
  2. 确认摄像头编号,必要时修改 CAMERA_INDEXCAMERA_INDEXES
  3. 确认 YOLO 模型路径,例如 /home/drobotics/yolov8n.pt
  4. 在无人机上运行前,先单独验证摄像头、推理速度、保存路径和散热。

完整代码: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 任务逻辑,实现识别触发、悬停、返航、录像或地面站告警。

返回 DRF450 YOLO 章节