基于树莓派 5 开发一套 “广角镜头拍照→自动识别鸟类→驱动长焦镜头追踪→直播视频” 的完整系统,这个需求涉及硬件选型、AI 识别、电机控制、视频推流几个环节,我将从硬件到软件、从核心功能到整合调试,给出详细的分步实现方案。
一、整体方案架构梳理
先明确系统的核心流程:

二、硬件选型(
硬件是基础,兼顾树莓派 5 的性能、功耗和接口兼容性,重点关注以下组件:
组件类型 | 具体选型 | 核心要求 |
主控板 | 树莓派 5(2GB RAM 版)+ PCIE扩展+ssd硬盘 + 5V 5A 电源 | 2GB RAM 实用YOLOv8 勉强够用,5A电流保证稳定供电 |
广角摄像头 | 手头正好有个100度的USB 广角摄像头 | 视角≥100°,帧率≥15fps,分辨率 1080P 即可(仅用于识别定位,无需超高清) |
长焦摄像头 | 微雪电子的 25mm 长焦镜头+树莓派 HQ 摄像头 | 支持手动 / 电动调焦,分辨率≥1080P,帧率≥25fps(保证直播流畅) |
云台 / 电机 | 二轴数字舵机云台MG996R | 扭矩≥5kg・cm(带动长焦镜头不卡顿),支持 PWM 控制(树莓派 GPIO 直驱) |
视频推流配件 | 直接通过树莓派5的无线网卡推流 | 树莓派 5 自带千兆网,保证推流带宽 |
关键选择:
虽然树莓派官方摄像头(CSI 接口)更好,比USB 摄像头延迟更低,适配性更好,但手头正好有个usb的摄像头,先用这个顶着;长焦镜头使用微雪电子的25mm镜头,比较便宜,只要两百多

舵机务必选数字舵机(精度高),避免模拟舵机定位偏差大,正好手头有个MG996R就先用这个了;
暂时考虑部署在室内环境,所以防雨防雾暂时可以简单保护即可。
三、分步实现步骤(核心落地环节)
步骤 1:环境搭建(树莓派 5 基础配置)
树莓派 5 的系统和依赖配置是基础,需优化性能适配 YOLOv8 和视频处理:
刷写系统:安装 Raspberry Pi OS 64 位,并购买PCIE 到m2 nvme ssd扩展卡和nvme ssd硬盘,这样配置的读写速度比使用micro sd快得多
安装核心依赖:
# 安装YOLOv8依赖
pip install ultralytics opencv-python-headless numpy
# 安装舵机控制库pigpio
pip install RPi.GPIO pigpio
# 安装视频推流依赖ffmpeg
sudo apt install ffmpeg -y
优化 YOLOv8 推理速度:
树莓派 5 算力有限,需对 YOLOv8 模型轻量化:
用yolov8n.pt(最小模型)自己训练鸟类专属轻量化模型;
开启 OpenVINO加速:

步骤 2:YOLOv8 鸟类识别与定位(核心 AI 环节)
核心目标是:从广角画面中识别鸟类,并输出目标的像素坐标 / 相对角度,为云台追踪提供依据。
数据集准备:
YOLOv8 默认模型对鸟类识别精度不足,需训练专属鸟类数据集:
下载开源鸟类数据集:Birds-525(525 种鸟类,标注好的 YOLO 格式);
补充实拍数据:用广角摄像头拍附近区域的鸟类,用 LabelImg 标注,扩充数据集;
训练轻量化模型:在 PC 上训练(树莓派训练太慢):
# 训练命令(PC端执行,适配树莓派)
yolo detect train data=birds.yaml model=yolov8n.pt epochs=50 imgsz=640 batch=16 device=cpu # 无GPU用cpu
实时识别与坐标提取:
编写代码,从广角摄像头读取画面,识别鸟类并输出目标中心坐标:
from ultralytics import YOLO
import cv2
import numpy as np
# 加载训练好的轻量化模型
model = YOLO("birds_yolov8n.pt")
# 打开广角摄像头(usb摄像头)
cap = cv2.VideoCapture(1)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
def get_bird_position(frame):
"""识别鸟类并返回目标中心坐标 (x,y),无鸟返回None"""
results = model(frame, imgsz=640, conf=0.5) # conf=0.5过滤低置信度
if len(results[0].boxes) == 0:
return None
# 取置信度最高的鸟类目标
box = results[0].boxes[0]
x1, y1, x2, y2 = box.xyxy[0].cpu().numpy() # 目标框坐标
center_x = (x1 + x2) / 2
center_y = (y1 + y2) / 2
return (center_x, center_y)
# 实时识别测试
while True:
ret, frame = cap.read()
if not ret:
break
bird_pos = get_bird_position(frame)
if bird_pos:
print(f"识别到鸟类,中心坐标:{bird_pos}")
# 画框标注
cv2.circle(frame, (int(bird_pos[0]), int(bird_pos[1])), 5, (0,255,0), -1)
cv2.imshow("Wide Angle View", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
坐标转角度(云台控制前置):
广角画面的像素坐标需转为云台的旋转角度,核心逻辑:
标定:先记录云台 “中心位置” 对应的画面中心坐标(约为中心640,360);
计算偏移:dx = bird_x - 640,dy = bird_y - 360;
像素转角度:提前测试 “1 像素对应云台旋转多少度”(经测约10 像素 = 1°),公式:angle_x = dx / 10,angle_y = dy / 10。
步骤 3:云台控制(驱动长焦镜头追踪)
树莓派 5 通过 GPIO 控制二轴舵机,驱动长焦镜头对准鸟类:
舵机初始化(用 pigpio 库,精度更高):
# 启动pigpio服务
sudo pigpiod
舵机控制代码:
import pigpio
import time
# 初始化pigpio
pi = pigpio.pi()
if not pi.connected:
exit()
# 舵机引脚定义(水平X轴,垂直Y轴)
SERVO_X_PIN = 18
SERVO_Y_PIN = 19
# 舵机参数:500=0°,1500=90°,2500=180°
MIN_PULSE = 500
MAX_PULSE = 2500
CENTER_PULSE = 1500
def set_servo_angle(pin, angle):
"""将角度转为舵机脉冲宽度,控制旋转角度"""
# 角度范围0-180°
angle = max(0, min(180, angle))
pulse = MIN_PULSE + (angle / 180) * (MAX_PULSE - MIN_PULSE)
pi.set_servo_pulsewidth(pin, pulse)
time.sleep(0.1) # 等待舵机到位
def track_bird(bird_pos):
"""根据鸟类坐标控制云台追踪"""
# 初始角度(中心位置)
current_x_angle = 90
current_y_angle = 90
# 计算偏移角度(10像素=1°)
dx = bird_pos[0] - 640
dy = bird_pos[1] - 360
delta_x = dx / 10
delta_y = dy / 10
# 更新角度
new_x_angle = current_x_angle + delta_x
new_y_angle = current_y_angle + delta_y
# 控制舵机旋转
set_servo_angle(SERVO_X_PIN, new_x_angle)
set_servo_angle(SERVO_Y_PIN, new_y_angle)
return (new_x_angle, new_y_angle)
# 测试:控制云台回到中心
set_servo_angle(SERVO_X_PIN, 90)
set_servo_angle(SERVO_Y_PIN, 90)
步骤 4:视频直播推流(长焦镜头视频输出)
树莓派 5 将长焦摄像头的视频编码后推流到直播平台(先用本地测试,后面推到B 站等),核心用 ffmpeg 实现:
先测试长焦摄像头采集:
# 读取长焦摄像头视频(假设CSI接口,编号1)
cap_long = cv2.VideoCapture(1)
cap_long.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
cap_long.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)
cap_long.set(cv2.CAP_PROP_FPS, 25)
ffmpeg 推流命令(核心):
树莓派 5 的 CPU 足够编码 1080P 25fps 视频,推流到本地测试:
#直接读取CSI摄像头推流(低延迟)
ffmpeg -f v4l2 -input_format h264 -video_size 1920x1080 -framerate 25 -i /dev/video1 \
-c:v copy -f flv "rtmp://localhost:1935/live/birds"
步骤 5:系统整合(核心逻辑串联)
将 “识别→追踪→推流” 整合为完整代码,加入异常处理和状态判断,基本达到预定目标。
我要赚赏金
