前言
由于最近在使用树莓派时,通过python使用opencv库调用摄像头的时候总是读取到空图像,但是设备列表里可以检查到video0,调用也没报错,所以仔细阅读了官方文档,并在网上查阅了相关资料,终于解决了问题。
本文中所使用的系统是目前官方最新的于2022-04-04发布的Raspberry Pi OS Lite(32-bit) Bullseye,树莓派型号为zero 2w,摄像头为OV5640模组。
在这里贴出树莓派官网的摄像头模块文档链接,想更全面的了解摄像头使用的小伙伴可以前往阅读。
一、问题起因
从树莓派官方文档中可以看到,Bullseye以后的Raspberry Pi OS 将仅包含libcamera库,不再包含传统的Raspicam库。
使用官方提供的libcamera-app测试,通过以下指令可以获取到摄像头拍摄的照片:
libcamera-jpeg -o test.jpg
这代表摄像头可以被设备读取,但是使用opencv调用摄像头读取图像并存储时,程序会报错图像为空。
使用指令
vcgencmd get_camera
返回
supported=0 detected=0
无法识别到硬件摄像头。
我猜测就是因为使用了新系统libcamera库,所以导致opencv无法调用摄像头获取图像。
二、解决方案
1.安装Raspicam摄像头库
在终端运行以下指令:
cd ~
sudo apt install cmake
git clone https://github.com/raspberrypi/userland
cd userland
./buildme
sudo cp build/bin/* /bin/
2.修改config.txt文件
config文件位于TF卡根目录,即/boot中。
在config.txt文件中注释以下语句(原本没有#号):
#camera_auto_detect=1
#dtoverlay=vc4-kms-v3d
在[all]下方添加以下语句:
dtoverlay=vc4-fkms-v3d
start_x=1
保存后重启树莓派:
sudo reboot
3.测试摄像头
再次使用指令
vcgencmd get_camera
返回
supported=1 detected=1
摄像头已可以被检测到
使用opencv测试,可以正常拍摄照片。
总结
尽管树莓派官方声称libcamera具有众多优点,但是仍然存在不少bug,所以官方也开放了旧版库的安装渠道,如果在使用摄像头方面存在无法解决的bug,可能选择更稳定的Raspicam不失为一个节省时间好办法。