共计 2112 个字符,预计需要花费 6 分钟才能阅读完成。
如果是原生的 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
或者编译装置
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() |
图片即摄像头的画面