关于raspberry-pi:x64树莓派系统使用CSI摄像头

如果是原生的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()

图片即摄像头的画面

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理