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] |
WIDTH | 1920 |
HEIGHT | 1080 |
INTERVAL | 0.5 |
SAVE_DIR | os.getcwd() |
JPEG_QUALITY | 95 |
运行前检查
- 安装依赖:
pip install opencv-python ultralytics - 确认摄像头编号,必要时修改
CAMERA_INDEX或CAMERA_INDEXES。 - 确认 YOLO 模型路径,例如
/home/drobotics/yolov8n.pt。 - 在无人机上运行前,先单独验证摄像头、推理速度、保存路径和散热。
完整代码: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 任务逻辑,实现识别触发、悬停、返航、录像或地面站告警。