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 章节