Raspi5接入CSI摄像头问题记录

/ 默认分类 / 0 条评论 / 92浏览

设备与环境


🚧 问题一:执行 libcamera-hello 报错 symbol lookup error

❗ 错误信息:

libcamera-hello: symbol lookup error: /lib/arm-linux-gnueabihf/libcamera.so.0.2: undefined symbol: _ZN7libpisp22compute_optimal_strideER24pisp_image_format_config

✅ 解决过程:

  1. 检查 libpisp 安装版本:
dpkg -l | grep libpisp
  1. 重新安装依赖库(避免版本不一致):
sudo apt update
sudo apt install --reinstall libcamera0 libcamera-apps libpisp1 libpisp-common
  1. 若依赖冲突,排查 libcamera-ipalibcamera0.4 等版本问题,并使用 aptitudeapt install 排查破坏链条。

🚧 问题二:libEGL 报错,图像预览窗口无法正常创建

❗ 错误信息:

libEGL warning: DRI2: failed to authenticate  
libEGL fatal: did not find extension DRI_Mesa version 1

✅ 解决方式:

安装缺失的 Mesa 图形驱动:

sudo apt update
sudo apt install -y libgl1-mesa-dri libgles2-mesa libglx-mesa0

🚧 问题三:仍报 EGL 错误,ZINK 失败,显示图像失败

❗ 报错提示:

libEGL warning: DRI3: Screen seems not DRI3 capable  
MESA: error: ZINK: failed to choose pdev  
libEGL warning: egl: failed to create dri2 screen

✅ 关键解决:配置 /boot/config.txt 开启图形加速

  1. 编辑配置文件:
sudo nano /boot/config.txt
  1. 在文件末尾添加:
dtoverlay=vc4-kms-v3d
gpu_mem=128
  1. 保存后重启系统:
sudo reboot

备注:这将启用 KMS 模式的 GPU 图形驱动,libcamera 所需的图形预览依赖于此。

🚧 问题四:HDMI 显示器桌面界面变小

启用 vc4-kms-v3d 后,树莓派可能不再自动识别显示器分辨率或仍使用了之前设定的低分辨率模式。

直接重新设置想要的分辨率即可。

什么是 dtoverlay

dtoverlay 是树莓派用于加载 设备树覆盖(Device Tree Overlay) 的配置项,它的作用是:

启用、配置或修改某些硬件功能(如 SPI、I2C、摄像头、GPU、显示屏等)的行为和驱动模块加载方式。

设备树就像树莓派的“硬件功能说明书”,而 overlay 就像是“插件补丁”,告诉系统哪些硬件功能要启用、怎么连线、加载哪些驱动等。

🔍 一些常见的 dtoverlay 示例及含义

| 配置项 | 含义 | | --- | --- | | dtoverlay=vc4-kms-v3d | 启用 KMS(Kernel Mode Setting)驱动,这是 libcamera 图形预览所需的现代图形栈,使用 DRM 管理显示输出。 | | dtoverlay=vc4-fkms-v3d | 启用 Fake KMS(兼容模式),适用于旧的显示驱动。 | | dtoverlay=spi0-1cs | 启用 SPI0 端口并启用第一个片选引脚(CS0)。 | | dtoverlay=i2c1 | 启用 I2C1 接口,摄像头等模块依赖。 | | dtoverlay=mhs32:rotate=270 | 启用 mhs32 型号的 SPI 屏幕 并旋转显示角度 270 度(你当前使用的是这个屏幕) | | dtoverlay=imx219 | 启用 CSI 摄像头驱动(针对特定型号) |


🔍 你当前配置的分析

以下是你在 /boot/config.txt 中的实际内容:

hdmi_force_hotplug=1
dtparam=i2c_arm=on
dtparam=spi=on
enable_uart=1
dtoverlay=mhs32:rotate=270
# hdmi_group=2
# hdmi_mode=1
dtoverlay=vc4-kms-v3d
gpu_mem=128

每行说明如下:

| 配置项 | 含义 | | --- | --- | | hdmi_force_hotplug=1 | 即使 HDMI 没有检测到连接显示器,也强制输出信号(防止开机时没插 HDMI 导致不输出)。 | | dtparam=i2c_arm=on | 启用主板上的 I2C 接口(用于连接摄像头、传感器)。 | | dtparam=spi=on | 启用 SPI 接口(你的 mhs32 屏幕就靠这个)。 | | enable_uart=1 | 启用串口(如用于串口调试)。 | | dtoverlay=mhs32:rotate=270 | 加载名为 mhs32 的 overlay,启用 SPI 屏并旋转 270 度。 | | dtoverlay=vc4-kms-v3d | 使用 KMS 图形驱动(解决 libcamera EGL 报错的关键配置)。 | | gpu_mem=128 | 分配 128MB 内存给 GPU,图像处理更稳定(默认是 64MB)。 | | # hdmi_group=2 # hdmi_mode=1 | 注释掉,避免限制 HDMI 分辨率,让系统自动检测显示器分辨率。 |


🤔 为什么必须启用 vc4-kms-v3d 才能解决问题?

🔺 问题背景:

libEGL warning: DRI2: failed to authenticate
libEGL fatal: did not find extension DRI_Mesa version 1
MESA: error: ZINK: failed to choose pdev

✅ 启用 vc4-kms-v3d 后的作用:

拓展知识:KMS vs FKMS vs Framebuffer

| 模式 | 全称 | 特点 | 适用场景 | | --- | --- | --- | --- | | vc4-kms-v3d | Kernel Mode Setting | 最新推荐,完整 DRM 管理,支持多显示器和 EGL | libcamera + 图形界面 | | vc4-fkms-v3d | Fake KMS | 用旧的用户空间设置模拟 KMS,兼容性好 | GUI 桌面或旧屏幕 | | (无) | Framebuffer only | 无 GPU 加速,仅基础显示 | 仅终端显示或 SPI 屏幕 |


✅ 小结

| 问题 | 修改项 | 原因 | | --- | --- | --- | | libcamera 预览失败,EGL 报错 | 添加 dtoverlay=vc4-kms-v3d | 启用 GPU KMS 驱动,支持 OpenGL 渲染 | | HDMI 桌面显示过小 | 注释 hdmi_group / hdmi_mode | 允许系统自动识别最佳分辨率 | | SPI 屏幕无显示或旋转错误 | 设置 dtoverlay=mhs32:rotate=270 | 加载正确驱动并控制方向 | | 图像卡顿或闪烁 | 增加 gpu_mem=128 | 提高 GPU 处理能力 |

处理完之后执行

#延迟5s拍照
libcamera-still --timeout 5000 -o image.jpg

#实时预览画面
libcamera-still -t 0

实时画面捕获正常了。