最近需要用树莓派4b跑个物体跟踪程序,拿出了以前买的套件,当时配的是官方v2摄像头,用的以前的驱动,可以用raspistill -v -o test.jpg
获取图片。
但是几年前的系统太老了,还是32位18.04,既然要搞,肯定要用最新的系统和软件了。结果踩了不少坑,记录如下:
首先安装最新的64位ubuntu 22.04,ubuntu已经对树莓派支持非常好了,libraspberrypi-bin、libraspberrypi-dev、raspi-config都可以直接apt安装,不需要额外添加第三方源了
装好后sudo raspi-config
,enable相机接口,提示lagacy驱动不推荐使用,不过还是能启用。
然后去树莓派官方文档查询,发现已经推荐使用libcamera作为摄像头驱动了
接下来从官网这个教程安装labcamera。虽然文档里说,可以直接apt 安装libcamera-dev 这样就只需要编译安装libcamera-app,但是我测试不行,libcamera-dev明显还没做好,编译libcamera-app时头文件缺失,库也找不到,所以还是建议老老实实先编译安装libcamera,再编译安装libcamera-app。
装完之后,运行libcamera-hello
,这时候可能会报两种错
第一个是
the system appears to be configured for the lagacy camera stack.
这就是提示使用了老版本的相机驱动,原因就是在sudo raspi-config开启了老版本驱动导致的。
解决方法:可以直接修改/boot/firmware/config.txt文件,如果有的话,删除或注释掉如下两条内容:
start_x=1
camera_auto_detect=1
然后在文件末尾加上
dtoverlay=imx219
(注意我是v2摄像头,所以是imx219传感器,如果用的别的型号,这里要随之更改,具体参考官方文档),保存后重启即可。
第二个错误可能是
could not open any dmaHeap device
Failed to register camera imx219 10-0010: -12
这个错误的原因其实是用户没有video权限导致的,可以sudo libcamera-hello
,或者执行
sudo usermod -aG video $USER
执行完毕后重启,再运行libcamera-hello
应该出来图像了
过程中我被网上各种文章最大的误导就是vcgencmd get_camera
这条指令,看别的文章执行这条指令的结果好像必须是supported=1 detected=1
才对,实际上这条指令还是针对老的驱动,用libcamera的时候,根本不需要考虑 vcgencmd get_camera,正常使用libcamera的时候,这条指令结果其实是supported=0 detected=0
才对。
好了,现在可以写个简单的python代码测试一下,这里是使用 subprocess 来运行 libcamera-vid 并将其输出到一个管道。然后用 OpenCV 从这个管道中读取并显示视频。
import cv2
import subprocess as sp
import numpy as np
# 创建一个 subprocess 来运行 libcamera-vid
command = "libcamera-vid -t 0 -o -"
pipe = sp.Popen(command, stdout=sp.PIPE, stderr=sp.PIPE, shell=True, bufsize=10**8)
# 创建一个 OpenCV 窗口
cv2.namedWindow('Libcamera with OpenCV', cv2.WINDOW_NORMAL)
while True:
# 从管道中读取一帧图像
raw_image = pipe.stdout.read(640*480*3)
image = np.frombuffer(raw_image, dtype='uint8').reshape((480, 640, 3))
# 显示图像
cv2.imshow('Libcamera with OpenCV', image)
# 按 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
pipe.stdout.flush()
cv2.destroyAllWindows()