如果是原生的 32 位系统, 不需要看此文章
OpenFans 的 x64 系统没有
raspistill,raspivid
, 所以无法通过此命令来操作摄像头
Python 的操作类 PiCamera 需要 libmmal.so, 但是此 so 没有 x64 的版本, 所以无法使用 PiCamera
报错如下
OSError: libmmal.so: cannot open shared object file: No such file or directory
但是可以使用 opencv/FFMPEG 直接操作 / dev/video0 来得到视频 / 图片
设备
树莓派 4B
CSI 摄像头 1.3 价值 13 元左右
OpenFans 的 x64 的树莓派系统
步骤
插入 CSI 的摄像头
蓝色那边在 USB 插口侧
修改配置
由于此系统没有 raspi-config ,rpi-update 等, 所以需要自己修改 / boot/config.txt 来增加摄像头
- start_x=1 # essential
- gpu_mem=128 # at least, or maybe more if you wish
- disable_camera_led=1 # optional, if you don't want the led to glow
读取 bcm2835-v4l2 模块
modprobe bcm2835-v4l2
配置开机自动加载
echo 'bcm2835-v4l2'>> /etc/modules
重启
系统重启后, 会出现一个 / dev/video0 的设备, 执行下文命令不会报错即安装成功
ls /dev/video0
多路访问
此时, 摄像头只能被一个进程访问, 如果希望多进程同时访问, 可以执行以下步骤. 没有此需求则跳过
- apt install raspberrypi-kernel-headers
- Git clone https://github.com/umlaeute/v4l2loopback
- cd v4l2loopback
- make
- sudo make install
- apt install FFMPEG
- FFMPEG -f video4linux2 -i /dev/video0 -vcodec copy -f v4l2 /dev/video1
- apt install gstreamer1.0-tools gstreamer1.0-plugins-good
- gst-launch-1.0 v4l2src device=/dev/video0 ! v4l2sink device=/dev/video1
- Git clone https://github.com/mpromonet/v4l2tools
- sudo apt install liblog4cpp5-dev
- make v4l2copy
- ./v4l2copy /dev/video0 /dev/video1
- import cv2 as cv
- # 读取设备
- cap = cv.VideoCapture('/dev/video0', cv.CAP_V4L)
- # 读取摄像头 FPS
- fps = cap.get(cv.CAP_PROP_FPS)
- # set dimensions 设置分辨率
- cap.set(cv.CAP_PROP_FRAME_WIDTH, 800)
- cap.set(cv.CAP_PROP_FRAME_HEIGHT, 400)
- video = cv.VideoWriter('video.avi', cv.VideoWriter_fourcc('I', '4', '2', '0'), fps, (800, 400)) # 初始化文件写入 文件名 编码解码器 帧率 文件大小
- # 录制 10 帧
- for i in range(10):
- # take frame 读取帧
- ret, frame = cap.read()
- if ret:
- # write frame to file
- cv.imwrite('image-{}.jpg'.format(i), frame) # 截图
- video.write(frame) # 录制视频
- # release camera 必须要释放摄像头
- cap.release()
来源: https://segmentfault.com/a/1190000040009665