当前位置: 首页 > article >正文

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,确保系统启用摄像头:

# 让系统自动检测摄像头
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 里,摄像头驱动需要手动加载

modprobe bcm2835_v4l2

确保 bcm2835_v4l2 被自动加载

echo "bcm2835_v4l2" >> /etc/modules

🔹 驱动解释

  • bcm2835-v4l2树莓派的 V4L2(Video4Linux)驱动
  • /dev/video0 设备正确生成
  • libcamera 需要 vc4-kms-v3dbcm2835-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 用于摄像头 API
  • v4l-utilsv4l2-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 cv2cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()if not ret:breakcv2.imshow("摄像头", frame)if cv2.waitKey(1) & 0xFF == ord('q'):  # 按 'q' 退出breakcap.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 项目中配置树莓派摄像头

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

✅ 关键命令总结

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

相关文章:

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

—— 从驱动配置、Yocto 构建,到 OpenCV 实战 在树莓派上运行摄像头,在官方的 Raspberry Pi OS 可能很简单,但在 Yocto 项目中,需要手动配置驱动、设备树、软件依赖 才能确保摄像头正常工作。本篇文章从 BSP 驱动配置、Yocto 关键…...

seaborn中文乱码

在进行matplotlib画图的时候,经常会出现中文乱码的问题,这主要是默认的文件不支持中文,可以在代码中显示指定。解决方法: import seaborn as sns import matplotlib.pyplot as pltplt.rcParams["font.sans-serif"] ["SimHei"] # …...

函数的特殊形式——递归函数

C递归函数入门指南:从概念到实践 ​1. 什么是递归? 递归是指函数直接或间接调用自身的过程,就像照镜子时影像无限反射,通过不断分解问题解决问题 适用场景: 问题可分解为相同子问题(如阶乘、斐波那契数列…...

计算最大海岛面积

最大海岛面积问题的不同解法 问题举例 给定一个包含了一些 0 和 1 的非空二维数组 matrix 。 一个岛屿是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设matrix的四个边缘都被 0(代表水&am…...

list的两个实现类

ArrayList&#xff1a;适用于需要频繁随机访问元素 LinkedList&#xff1a;适用于需要频繁进行插入和删除操作&#xff0c;尤其是在列表的头部或尾部进行操作 二者的用法基本一致&#xff0c;只是时间和空间复杂度不同 List<Integer> arrayList new ArrayList<>…...

Spark核心之02:RDD、算子分类、常用算子

spark内存计算框架 一、目标 深入理解RDD弹性分布式数据集底层原理掌握RDD弹性分布式数据集的常用算子操作 二、要点 ⭐️1. RDD是什么 RDD&#xff08;Resilient Distributed Dataset&#xff09;叫做**弹性分布式数据集&#xff0c;是Spark中最基本的数据抽象&#xff0c…...

配置Nginx日志url encode问题

文章目录 配置Nginx日志url encode问题方法1-lua方法2-set-misc-nginx-module 配置Nginx日志url encode问题 问题描述&#xff1a; 当自定义日志输出格式&#xff0c;需要输出http请求中url参数时&#xff0c;如果参数中包含中文&#xff0c;是会进行url encode的&#xff0c…...

[Windows] 批量为视频或者音频生成字幕 video subtitle master 1.5.2

Video Subtitle Master 1.5.2 介绍 Video Subtitle Master 1.5.2 是一款功能强大的客户端工具&#xff0c;能够批量为视频或音频生成字幕&#xff0c;还支持批量将字幕翻译成其他语言。该工具具有跨平台性&#xff0c;无论是 mac 系统还是 windows 系统都能使用。 参考原文&a…...

AIP-158 分页

编号158原文链接AIP-158: Pagination状态批准创建日期2019-02-18更新日期2019-02-18 API通常需要提供数据集&#xff0c;最常见的是 List 标准方法。但集合大小往往是不受控制的&#xff0c;会随着时间增长&#xff0c;提高了查找时间和通过网络传输的应答大小。因此对集合进行…...

进来了解一下python的深浅拷贝

深浅拷贝是什么&#xff1a;在Python中&#xff0c;理解深拷贝&#xff08;deep copy&#xff09;和浅拷贝&#xff08;shallow copy&#xff09;对于处理复杂的数据结构&#xff0c;如列表、字典或自定义对象&#xff0c;是非常重要的。这两种拷贝方式决定了数据在内存中的复制…...

第三阶段-产品方面的技术疑难

一、虚拟机和容器的区别&#xff1f; 虚拟机&#xff08;Virtual Machine&#xff0c;VM&#xff09;和容器&#xff08;Container&#xff09;都是用于隔离和运行应用程序的技术&#xff0c;但它们在实现方式、性能、资源消耗和适用场景上有显著区别。以下是虚拟机和容器的主…...

safetensors PyTorchModelHubMixin 加载模型

2025.03.03测试ok from safetensors.torch import load_fileimport yamlwith open("configs/maggie_image.yaml", r, encodingutf8) as file: # utf8可识别中文data yaml.safe_load(file)class Config:def __init__(self, **kwargs):for key, value in kwargs.item…...

解锁GPM 2.0「卡顿帧堆栈」|代码示例与实战分析

每个游戏开发者都有一个共同的愿望&#xff0c;那就是能够在无需复现玩家反馈的卡顿现象时&#xff0c;快速且准确地定位卡顿的根本原因。为了实现这一目标&#xff0c;UWA GPM 2.0推出了全新功能 - 卡顿帧堆栈&#xff0c;旨在为开发团队提供高效、精准的卡顿分析工具。在这篇…...

‌Transformer架构

‌核心原理‌ ‌自注意力机制‌ 通过计算输入序列中每个位置与其他位置的关联权重&#xff08;Query-Key匹配&#xff09;&#xff0c;动态聚合全局信息&#xff0c;解决了传统RNN/CNN的长距离依赖问题‌。 实现公式&#xff1a;Attention(Q,K,V)softmax(QKTdk)VAttention(…...

微服务,服务治理nacos,负载均衡LOadBalancer,OpenFeign

1.微服务 简单来说&#xff0c;微服务架构风格[1]是一种将一个单一应用程序开发为一组小型服务的方法&#xff0c;每个服务运行在 自己的进程中&#xff0c;服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并 且可通过全自动部署机制独立部署。这…...

服务器租用:静态BGP和动态BGP分别指什么?

今天小编主要来带大家一起了解一下静态BGP和动态BGP分别是指什么&#xff1f; BGP主要是用在不同网络之间进行交换路由信息的协议&#xff0c;通常是用在互联网当中&#xff0c;而静态BGP和动态BGP是两种不同的方法来配置BGP路由&#xff0c;静态BGP路由是由手动配置的&#xf…...

栈和队列的模拟实现

文章目录 一. 回顾栈和队列二. stack的模拟实现stack.hstack.cpp 三. queue的模拟实现queue.htest.cpp 四. 了解dequeuevector和list都有各自的缺陷deque 总结 一. 回顾栈和队列 回顾一下栈和队列 栈&#xff1a;stack&#xff1a;后进先出 _ 队列&#xff1a;queue&#xf…...

CSDN博客写作教学(五):从写作到个人IP的体系化构建(完结篇)

导语 (第一篇)Markdown编辑器基础 (第二篇)Markdown核心语法 (第三篇)文章结构化思维 (第四篇)标题优化与SEO实战 通过前四篇教程,你已掌握技术写作的“术”——排版、标题、流量与数据。但真正的价值在于将技能升维为“道”:用技术博客为支点,撬动个人品牌与职业发…...

Django 项目模块化开发指南:实现 Vue 风格的组件化

在 Django 项目中,我们经常需要 复用 HTML 代码,避免重复编写相同的模板。例如,博客系统中,博客列表页 和 文章详情页 可能都有相同的 导航栏、模态框、页脚 等。如何像 Vue 一样进行 模块化开发,让代码更加清晰、可维护呢? 本文将详细介绍 Django 的模板继承 和 {% incl…...

unity pico开发 四 物体交互 抓取 交互层级

文章目录 手部设置物体交互物体抓取添加抓取抓取三种类型抓取点偏移抓取事件抓取时不让物体吸附到手部 射线抓取交互层级 手部设置 为手部&#xff08;LeftHandController&#xff09;添加XRDirInteractor脚本 并添加一个球形碰撞盒&#xff0c;勾选isTrigger,调整大小为0.1 …...

opencv 模板匹配方法汇总

在OpenCV中&#xff0c;模板匹配是一种在较大图像中查找特定模板图像位置的技术。OpenCV提供了多种模板匹配方法&#xff0c;通过cv2.matchTemplate函数实现&#xff0c;该函数支持的匹配方式主要有以下6种&#xff0c;下面详细介绍每种方法的原理、特点和适用场景。 1. cv2.T…...

【PromptCoder + Cursor】利用AI智能编辑器快速实现设计稿

【PromptCoder Cursor】利用AI智能编辑器快速实现设计稿 官网&#xff1a;PromptCoder 在现代前端开发中&#xff0c;将设计稿转化为可运行的代码是一项耗时的工作。然而&#xff0c;借助人工智能工具&#xff0c;这一过程可以变得更加高效和简单。本文将介绍如何结合 Promp…...

MySQL面试01

MySQL 索引的最左原则 &#x1f370; 最左原则本质 ͟͟͞͞( •̀д•́) 想象复合索引是电话号码簿&#xff01; 索引 (a,b,c) 的排列顺序&#xff1a; 先按a排序 → a相同按b排序 → 最后按c排序 生效场景三连&#xff1a; 1️⃣ WHERE a1 ✅ 2️⃣ WHERE a1 AND b2 ✅ 3️…...

webpack一篇

目录 一、构建工具 1.1简介 二、Webpack 2.1概念 2.2使用步骤 2.3配置文件&#xff08;webpack.config.js&#xff09; mode entry output loader plugin devtool 2.4开发服务器&#xff08;webpack-dev-server&#xff09; grunt/glup的对比 三、Vite 3.1概念 …...

健康饮食,健康早餐

营养早餐最好包含4大类食物&#xff1a;谷薯类&#xff1b;碳水&#xff1b;蛋白质&#xff1b;膳食纤维。 1.优质碳水 作用&#xff1a;提供持久的能量&#xff0c;避免血糖大幅波动等 例如&#xff1a;全麦面包、红薯&#x1f360;、玉米&#x1f33d;、土豆&#x1f954;、…...

常见的排序算法 【复习笔记】

注意&#xff1a; 1. 后面的排序算法实现都只考虑升序&#xff0c;对于逆序&#xff0c;只有知道原理&#xff0c;实现很容易 2. 案例题&#xff1a; 题目描述&#xff1a;将读入的 N 个数从小到大输出 ( 1 < N <10e5) 输入描述&#xff1a;第一行一个正整数 N 第二行…...

【经验分享】Ubuntu20.04 vmware虚拟机存储空间越来越小问题(已解决)

【经验分享】Ubuntu20.04 vmware虚拟机存储空间越来越小问题&#xff08;已解决&#xff09; 前言一、问题分析二、解决方案 前言 我们在使用虚拟机过程中&#xff0c;经常会碰到即使删除了一些文件&#xff0c;但是存储空间还是越来越小的问题。今天我们来解决下这个问题。 一…...

Jenkins-自动化部署-通知

场景 使用jenkins部署&#xff0c;但有时不能立马部署&#xff0c;需要先通知相关人员&#xff0c;再部署&#xff0c;如果确实不能部署&#xff0c;可以留时间撤销。 方案 1.开始前我们添加&#xff0c;真正开始执行的等待时间&#xff1b;可供选择&#xff08;Choice Param…...

Qt 文件操作+多线程+网络

文章目录 1. 文件操作1.1 API1.2 例子1&#xff0c;简单记事本1.3 例子2&#xff0c;输出文件的属性 2. Qt 多线程2.1 常用API2.2 例子1&#xff0c;自定义定时器 3. 线程安全3.1 互斥锁3.2 条件变量 4. 网络编程4.1 UDP Socket4.2 UDP Server4.3 UDP Client4.4 TCP Socket4.5 …...

《基于Hadoop的青岛市旅游景点游客行为分析系统设计与实现》开题报告

目录 一、选题依据 1.选题背景 2.国内外研究现状 &#xff08;1&#xff09;国内研究现状 &#xff08;2&#xff09;国外研究现状 3.发展趋势 4.应用价值 二、研究内容 1.学术构想与思路 2. 拟解决的关键问题 3. 拟采取的研究方法 4. 技术路线 (1)旅游前准备阶段 …...