—— 从驱动配置、Yocto 构建,到 OpenCV 实战
在树莓派上运行摄像头,在官方的 Raspberry Pi OS 可能很简单,但在 Yocto 项目中,需要手动配置驱动、设备树、软件依赖 才能确保摄像头正常工作。本篇文章从 BSP 驱动配置、Yocto 关键配置、OpenCV 实战 讲解如何 让树莓派摄像头在 Yocto 镜像中正常运行,并最终在 屏幕上实时显示画面。
1️⃣ Yocto 关键知识点
在 Yocto 项目中,摄像头的支持依赖:
📌 关键点
-
BSP(Board Support Package)配置
- 设备树(Device Tree)确保摄像头硬件被正确注册
config.txt
配置 GPU、摄像头固件
-
内核(Kernel)驱动
bcm2835-v4l2
模块:用于支持 V4L2 摄像头设备libcamera
:现代化的摄像头用户空间 APIv4l-utils
:V4L2 设备管理工具
-
镜像构建(Yocto Bitbake)
IMAGE_INSTALL
确保安装libcamera
、ffmpeg
、opencv
IMAGE_FEATURES
使系统支持 GUI 显示systemd
启动脚本 让摄像头 开机自动运行
-
用户空间(User Space)
ffmpeg
录制视频v4l2-ctl
进行摄像头测试OpenCV
进行实时图像处理
2️⃣ 驱动配置:设备树 & 内核
📌 2.1 设备树(Device Tree)配置
树莓派的摄像头使用 MIPI CSI-2 接口,在设备树中需要正确注册。
修改 Yocto BSP config.txt
,确保系统启用摄像头:
# 让系统自动检测摄像头
camera_auto_detect=1
# 启用 VC4-KMS 显示驱动,支持 `libcamera`
dtoverlay=vc4-kms-v3d
# 启用摄像头固件支持
start_x=1
# GPU 预留 128MB 内存(摄像头和 GUI 需要)
gpu_mem=128
🔹 关键点
camera_auto_detect=1
让树莓派 自动检测摄像头dtoverlay=vc4-kms-v3d
让libcamera
和ffmpeg
可以正确访问摄像头start_x=1
让 GPU 能够处理 ISP(图像信号处理)
📌 2.2 加载摄像头驱动
在 Yocto 里,摄像头驱动需要手动加载:
modprobe bcm2835_v4l2
确保 bcm2835_v4l2
被自动加载:
echo "bcm2835_v4l2" >> /etc/modules
🔹 驱动解释
bcm2835-v4l2
是 树莓派的 V4L2(Video4Linux)驱动- 让
/dev/video0
设备正确生成 libcamera
需要vc4-kms-v3d
和bcm2835-v4l2
才能正常工作
3️⃣ Yocto 镜像配置
为了让 Yocto 镜像包含摄像头所需的软件,修改 rpi-test-image.bb
:
# 继承 rpi-test-image
include recipes-core/images/rpi-test-image.bb
# 添加 SSH 服务器,方便远程调试
IMAGE_INSTALL:append = " openssh openssh-sftp-server"
# 启用 X11 图形界面支持
IMAGE_FEATURES += "x11-base x11-sato splash"
# 安装摄像头相关软件
IMAGE_INSTALL += " libcamera libcamera-apps v4l-utils"
# 安装 ffmpeg 和 OpenCV
IMAGE_INSTALL += " ffmpeg opencv opencv-apps python3-opencv"
🔹 关键点
libcamera
用于摄像头 APIv4l-utils
让v4l2-ctl
可以测试摄像头opencv
用于 Python 处理摄像头画面ffmpeg
让摄像头 支持录制视频
4️⃣ 编译 Yocto 镜像
完成配置后,运行:
bitbake core-image-sato
然后刷写到 SD 卡:
dd if=tmp/deploy/images/raspberrypi4-64/core-image-sato-raspberrypi4-64.wic of=/dev/sdX bs=4M status=progress
5️⃣ 摄像头驱动调试
📌 5.1 确保 /dev/video0
存在
ls /dev/video*
如果 /dev/video0
不存在,手动加载驱动:
modprobe bcm2835_v4l2
📌 5.2 使用 v4l2-ctl
测试摄像头
v4l2-ctl --list-devices
如果摄像头已检测到,运行:
v4l2-ctl --stream-mmap --stream-count=100 -d /dev/video0
6️⃣ 实战:运行 OpenCV 进行摄像头实时显示
运行以下 Python 代码:
import cv2
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow("摄像头", frame)
if cv2.waitKey(1) & 0xFF == ord('q'): # 按 'q' 退出
break
cap.release()
cv2.destroyAllWindows()
🎥 成功运行后,摄像头画面会在屏幕上实时显示!
7️⃣ 其他摄像头应用
📸 7.1 使用 ffmpeg
拍照
ffmpeg -f v4l2 -video_size 1280x720 -i /dev/video0 -vframes 1 snapshot.jpg
🎥 7.2 录制视频
ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video0 -t 10 output.mp4
📡 7.3 实时推流
ffmpeg -f v4l2 -i /dev/video0 -f mpegts udp://192.168.1.100:1234
在 VLC 中打开:
udp://@192.168.1.100:1234
8️⃣ 结果展示
最终,摄像头成功运行,并在屏幕上实时显示:
🎯 结论
本篇文章完整讲解了 如何在 Yocto 项目中配置树莓派摄像头:
- BSP 设备树配置
- 内核驱动
bcm2835-v4l2
加载 - Yocto 镜像构建
v4l2-ctl
&ffmpeg
测试- OpenCV 实战
- 流媒体推送
✅ 关键命令总结
任务 | 命令 |
---|---|
检查 /dev/video0 | ls /dev/video* |
测试 v4l2-ctl | v4l2-ctl --list-devices |
拍照 | ffmpeg -f v4l2 -i /dev/video0 -vframes 1 snapshot.jpg |
录制视频 | ffmpeg -f v4l2 -i /dev/video0 -t 10 output.mp4 |
实时显示(OpenCV) | python3 script.py |
🎯 如果你对 Yocto BSP、摄像头调试有任何问题,欢迎交流!🚀