Drobotics logo DROBOTICSTechnical Library

Drone Guide

YOLO 数据采集:Full HD 高清照片保存

All Drone

YOLO Vision Code

YOLO 数据采集:Full HD 高清照片保存

强制摄像头使用 MJPEG 与 1920x1080 分辨率,并以高 JPEG 质量保存带时间戳的图像。

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

脚本目标

打开 USB 摄像头,设置 Full HD 分辨率、MJPEG 编码和单帧缓冲,每 0.5 秒保存一张高质量图片。

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

学习重点

  • 适合采集更清晰的检测样本
  • 使用时间戳文件名,避免覆盖图片
  • MJPEG 设置能改善很多 USB 摄像头的高分辨率读取稳定性

关键参数

参数当前设置
CAMERA_INDEXES[0, 1, 2, 3, 4]
WIDTH1920
HEIGHT1080
INTERVAL0.5
SAVE_DIRos.getcwd()
JPEG_QUALITY95

运行前检查

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

完整代码:capture_hdfull.py

import cv2
import time
import os
from datetime import datetime

# =========================
# SETTINGS
# =========================
CAMERA_INDEXES = [0, 1, 2, 3, 4]

# Full HD resolution
WIDTH = 1920
HEIGHT = 1080

# Take photo every 0.5 seconds
INTERVAL = 0.5

# Save photos in the current folder
SAVE_DIR = os.getcwd()

# JPEG quality (0-100)
JPEG_QUALITY = 95


# =========================
# CAMERA INIT
# =========================
def open_camera(camera_indexes):
 for index in camera_indexes:
 print(f"Trying camera index {index}...")

 cap = cv2.VideoCapture(index)

 if not cap.isOpened():
 cap.release()
 continue

 # Force MJPEG before setting resolution. This helps many USB cameras.
 cap.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*"MJPG"))
 cap.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
 cap.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)
 cap.set(cv2.CAP_PROP_BUFFERSIZE, 1)

 ret, frame = cap.read()
 if ret and frame is not None:
 print(f"Camera opened successfully at index {index}")
 return cap, index

 cap.release()

 return None, None


cap, camera_index = open_camera(CAMERA_INDEXES)

if cap is None:
 print("Cannot open any camera")
 exit()

# Check actual resolution
actual_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
actual_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

print("==============================")
print("Camera started")
print(f"Using camera index: {camera_index}")
print(f"Resolution: {actual_width} x {actual_height}")
print(f"Saving to: {SAVE_DIR}")
print(f"Interval: {INTERVAL}s")
print("Press Ctrl+C to stop")
print("==============================")


# =========================
# CAPTURE LOOP
# =========================
count = 0

try:
 while True:
 ret, frame = cap.read()

 if not ret or frame is None:
 print("Failed to capture frame")
 break

 timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")
 filename = os.path.join(
 SAVE_DIR,
 f"image_{count:06d}_{timestamp}.jpg"
 )

 saved = cv2.imwrite(
 filename,
 frame,
 [cv2.IMWRITE_JPEG_QUALITY, JPEG_QUALITY]
 )

 if saved:
 print(f"Saved: {filename}")
 else:
 print(f"Failed to save: {filename}")

 count += 1
 time.sleep(INTERVAL)

except KeyboardInterrupt:
 print("\nStopped by user")

finally:
 cap.release()
 print("Camera released")

下一步

先完成摄像头采集,再运行实时检测或无界面检测。后续可以把人体检测结果接入 MAVLink 任务逻辑,实现识别触发、悬停、返航、录像或地面站告警。

返回 DRF450 YOLO 章节