Yocto + 树莓派摄像头驱动完整指南

------ 从驱动配置、Yocto 构建,到 OpenCV 实战

在树莓派上运行摄像头,在官方的 Raspberry Pi OS 可能很简单,但在 Yocto 项目中,需要手动配置驱动、设备树、软件依赖 才能确保摄像头正常工作。本篇文章从 BSP 驱动配置Yocto 关键配置OpenCV 实战 讲解如何 让树莓派摄像头在 Yocto 镜像中正常运行 ,并最终在 屏幕上实时显示画面


1️⃣ Yocto 关键知识点

在 Yocto 项目中,摄像头的支持依赖:

📌 关键点

  1. BSP(Board Support Package)配置

    • 设备树(Device Tree)确保摄像头硬件被正确注册
    • config.txt 配置 GPU、摄像头固件
  2. 内核(Kernel)驱动

    • bcm2835-v4l2 模块:用于支持 V4L2 摄像头设备
    • libcamera:现代化的摄像头用户空间 API
    • v4l-utils:V4L2 设备管理工具
  3. 镜像构建(Yocto Bitbake)

    • IMAGE_INSTALL 确保安装 libcameraffmpegopencv
    • IMAGE_FEATURES 使系统支持 GUI 显示
    • systemd 启动脚本 让摄像头 开机自动运行
  4. 用户空间(User Space)

    • ffmpeg 录制视频
    • v4l2-ctl 进行摄像头测试
    • OpenCV 进行实时图像处理

2️⃣ 驱动配置:设备树 & 内核

📌 2.1 设备树(Device Tree)配置

树莓派的摄像头使用 MIPI CSI-2 接口,在设备树中需要正确注册。

修改 Yocto BSP config.txt,确保系统启用摄像头:

sh 复制代码
# 让系统自动检测摄像头
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-v3dlibcameraffmpeg 可以正确访问摄像头
  • start_x=1 让 GPU 能够处理 ISP(图像信号处理)

📌 2.2 加载摄像头驱动

在 Yocto 里,摄像头驱动需要手动加载

sh 复制代码
modprobe bcm2835_v4l2

确保 bcm2835_v4l2 被自动加载

sh 复制代码
echo "bcm2835_v4l2" >> /etc/modules

🔹 驱动解释

  • bcm2835-v4l2树莓派的 V4L2(Video4Linux)驱动
  • /dev/video0 设备正确生成
  • libcamera 需要 vc4-kms-v3dbcm2835-v4l2 才能正常工作

3️⃣ Yocto 镜像配置

为了让 Yocto 镜像包含摄像头所需的软件 ,修改 rpi-test-image.bb

sh 复制代码
# 继承 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 用于摄像头 API
  • v4l-utilsv4l2-ctl 可以测试摄像头
  • opencv 用于 Python 处理摄像头画面
  • ffmpeg 让摄像头 支持录制视频

4️⃣ 编译 Yocto 镜像

完成配置后,运行:

sh 复制代码
bitbake core-image-sato

然后刷写到 SD 卡:

sh 复制代码
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 存在

sh 复制代码
ls /dev/video*

如果 /dev/video0 不存在,手动加载驱动:

sh 复制代码
modprobe bcm2835_v4l2

📌 5.2 使用 v4l2-ctl 测试摄像头

sh 复制代码
v4l2-ctl --list-devices

如果摄像头已检测到,运行:

sh 复制代码
v4l2-ctl --stream-mmap --stream-count=100 -d /dev/video0

6️⃣ 实战:运行 OpenCV 进行摄像头实时显示

运行以下 Python 代码:

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 拍照

sh 复制代码
ffmpeg -f v4l2 -video_size 1280x720 -i /dev/video0 -vframes 1 snapshot.jpg

🎥 7.2 录制视频

sh 复制代码
ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -i /dev/video0 -t 10 output.mp4

📡 7.3 实时推流

sh 复制代码
ffmpeg -f v4l2 -i /dev/video0 -f mpegts udp://192.168.1.100:1234

在 VLC 中打开:

udp://@192.168.1.100:1234

8️⃣ 结果展示

最终,摄像头成功运行,并在屏幕上实时显示:


🎯 结论

本篇文章完整讲解了 如何在 Yocto 项目中配置树莓派摄像头

  1. BSP 设备树配置
  2. 内核驱动 bcm2835-v4l2 加载
  3. Yocto 镜像构建
  4. v4l2-ctl & ffmpeg 测试
  5. OpenCV 实战
  6. 流媒体推送

✅ 关键命令总结

任务 命令
检查 /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、摄像头调试有任何问题,欢迎交流!🚀

相关推荐
Python小老六9 分钟前
从“0”开始入门PCB之(5)完结篇!--快速入门原理图DRC,PCB的符号与布局,2D与3D效果,PCB的图层和布线,PCB板框
单片机·嵌入式硬件·3d
星星不打輰12 分钟前
使用Ajax完成与后台服务器的数据交互
服务器·ajax·交互·edge浏览器
wjm0410061 小时前
Linux知识-第一天
linux·服务器
服务端相声演员1 小时前
Hadoop管理页看不到任务的问题
大数据·linux·hadoop
william0820121 小时前
IP地址怎么加密https访问?
服务器·网络协议·tcp/ip·网络安全·https·ssl
安 当 加 密1 小时前
安当KSP密钥管理系统:赋能电梯制造与运维全生命周期数据安全
运维·制造
爱喝矿泉水的猛男1 小时前
Windows 11 + Ubuntu 22.04双系统时间同步失败处理
linux·运维·ubuntu·双系统时间不同
rainFFrain1 小时前
动态库和静态库
linux·运维
weixin_519311741 小时前
通过多线程获取RV1126的AAC码流
linux
Мартин.1 小时前
[Meachines] [Easy] Toolbox PostgreSQLI-RCE+Docker逃逸boot2docker权限提升
运维·docker·容器