如果是原生的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
多路访问
此时,摄像头只能被一个进程访问,如果希望多进程同时访问,可以执行以下步骤。没有此需求则跳过
参考来源:
https://gist.github.com/brute...
https://raspberrypi.stackexch...
1. 安装回路驱动
apt install v4l2loopback-dkms
或者编译安装
openfans的系统可能无法编译安装
以下适用于32位的树莓派原生系统
apt install raspberrypi-kernel-headers
git clone https://github.com/umlaeute/v4l2loopback
cd v4l2loopback
make
sudo make install
2. 创建/dev/video1
此设备即多路访问的设备
modprobe v4l2loopback video_nr=1
配置开机自动创建echo 'options v4l2loopback video_nr=1' > /etc/modprobe.d/v4l2loopback.conf
3. 流转向
以下操作任意一个即可
3.1. 使用ffmpeg将video0
转向到多路video1
apt install ffmpeg
ffmpeg -f video4linux2 -i /dev/video0 -vcodec copy -f v4l2 /dev/video1
3.2. 使用gstreamer将video0
转向到多路video1
apt install gstreamer1.0-tools gstreamer1.0-plugins-good
gst-launch-1.0 v4l2src device=/dev/video0 ! v4l2sink device=/dev/video1
3.3. 使用v4l2tools 将video0
转向到多路video1
git clone https://github.com/mpromonet/v4l2tools
sudo apt install liblog4cpp5-dev
make v4l2copy
./v4l2copy /dev/video0 /dev/video1
opencv2读取摄像头
安装opencv2
你可以通过如下方式安装opencv2
,但是版本不是最新
apt install python3-opencv
或者通过pip安装,最新版,但是速度很慢,需要编译numpy很久
pip3 install opencv-python
截图&录像
会在当前目录输出10个image-0~9.jpg
和一个video.avi
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()
图片即摄像头的画面
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。