RaspberryPi 4 摄像头入门

RaspberryPi 4 摄像头入门

树莓派原装 1200 万像素高清摄像头 自动对焦 IMX708 摄像头模块 夜视 Wide 版视场角 120°

Raspberry Pi Camera Module 3 - Waveshare Wiki

使用的是如下的摄像头模块进行实验,带夜视功能

imageimage

Raspberry Pi OS Bookworm将相机捕获应用程序从 libcamera-* 改为 rpicam-* ,目前允许用户继续使用旧的libcamera,但是libcamera后续将被弃用,所以请尽快使用rpicam.

打开摄像头

节选自 waveshare 的 wiki

树莓派针对如下传感器的摄像头有驱动支持,可以看到 libcamera 支持很全

image

如果使用的是最新的 Raspberry Pi Camera Module 3 或者 Raspberry Pi Global Shutter Camera,需要运行以下指令进行系统更新(需要联网操作).

sudo apt-get update -y
sudo apt-get upgrade -y

如果只调用一个摄像头,请将摄像头接入到 CAM1 口.
如果使用的是是非树莓派官方的摄像头,均需要另外配置 config.txt 文件.
如果使用的是最新的 Bookworm 系统,需要配置的是/boot/firmware/config.txt。这次使用的 Pi4 的是 bookworm

sudo nano /boot/config.txt
#如果是bookworm系统
sudo nano /boot/firmware/config.txt
找到camera-auto-detect\=1 语句,修改为 camera\_auto\_detect\=0

image

打开树莓派终端,并开启摄像头预览:

sudo rpicam-hello -t 0

如果要关掉预览窗口,可以直接组合按键 Alt-F4,或者点击 x 关掉。 也可以回到终端界面,用 ctrl-c 终止程序。

指令和脚本 Note (问问 GPT)1

调谐文件

Raspberry Pi 的 libcamera 有针对每种不同类型的相机模块的调谐文件。文件里的参数将传递给算法和硬件以产生最佳质量的图像。 libcamera 只能自动确定正在使用的图像传感器,而不能自动确定整个模块,即使整个模块会影响“调谐”。因此,有时需要覆盖特定传感器的默认调谐文件。
例如,无红外滤光片 (NoIR) 版本的传感器需要与标准版本不同的 AWB(白平衡) 设置,因此与 Pi 4 或更早设备一起使用的 IMX219 NoIR 应使用以下方式运行:

rpicam-hello --tuning-file /usr/share/libcamera/ipa/rpi/vc4/imx708_noir.json

捕获视频和编码

rpicam-vid 可以帮助我们在树莓派设备上捕获视频。Rpicam-vid 显示一个预览窗口,并将编码的比特流写入指定的输出。这将产生一个未打包的视频比特流,它没有被打包在任何类型的容器(如 mp4 文件)格式中。

  • rpicam-vid 使用的是 H.264 编码

例如,下面的命令将一个 10 秒的视频写入一个名为 test.h264 的文件:

rpicam-vid -t 10s -o test.h264

您可以使用 VLC 和其他视频播放器播放结果文件:

VLC test.h264

rpicam-vid 支持动态 JPEG 以及未压缩和未格式化的 YUV420:

rpicam-vid -t 10000 --codec mjpeg -o test.mjpegrpicam-vid -t 10000 --codec yuv420 -o test.data

codec 选项决定输出格式,而不是输出文件的扩展名。

segment 选项将输出文件分割成段大小的块(以毫秒为单位)。通过指定非常短(1 毫秒)的段,这可以方便地将运动 JPEG 流分解为单个 JPEG 文件。例如,下面的命令将 1 毫秒的段与输出文件名中的计数器结合起来,为每个段生成一个新的文件名:

rpicam-vid -t 10000 --codec mjpeg --segment 1 -o test%05d.jpeg

视频编码2

捕获高帧率视频为了尽量减少高帧率(> 60fps)视频的帧丢失,请尝试以下配置调整:

  • 将 H.264 的目标水平用 --level 4.2 这个参数设置为 4.2
  • 通过将 denoise 选项设置为 cdn_off 来禁用软件颜色降噪处理。
  • 禁用 nopreview 的显示窗口以释放一些额外的 CPU 周期。
  • 在/boot/firmware/config.txt 中设置 force_turbo=1,确保在视频捕获过程中 CPU 时钟不节流。有关更多信息,请参阅 force_turbo 文档。
  • 将 ISP 输出分辨率参数调整为--width 1280 --height 720 或更低,以实现帧率目标。
  • 在 Raspberry Pi 4 上,您可以通过在/boot/firmware/config.txt 中添加 gpu_freq=550 或更高的频率来超频 GPU 以提高性能。有关详细信息,请参阅在超频文档。

下面的命令演示了如何实现 1280×720 120fps 视频:

rpicam-vid --level 4.2 --framerate 120 --width 1280 --height 720 --save-pts timestamp.pts -o video.264 -t 10000 --denoise cdn_off -n

libcamera 库

树莓派镜像在 Bullseye 版本之后,底层的树莓派驱动由 Raspicam 切换成 libcamera。libcamera 是一个开源的软件栈(后面会称呼做驱动,方便理解),方便于第三方移植和开发自己的摄像头驱动。截止到 20231211,官方已经针对 libcamera 提供了 pycamera2 库,方便用户使用 Python 程序调用


  1. 指令和脚本 Note (问问 GPT)

    你好,我最近在研究树莓派的摄像头模块,里面有一句测试指令:sudo rpicam-hello -t 0rpicam-hello 显然不是 debian 系统自带的指令,那么这样自定义的指令都是如何添加和使用的呢?

    1. 理解指令的来源

      • 在树莓派的摄像头模块相关操作中,rpicam - hello 这样的指令很可能是用户自己编写的脚本或者是安装特定的摄像头软件包后添加的工具。如果它不是系统自带的,那大概率是由第三方提供的。
    2. 添加自定义指令的一般方法

      • 编写脚本并放置在合适的位置

        • 你可以自己编写一个脚本,例如用 Python 或 Shell 脚本。如果是 Shell 脚本(以 .sh 为后缀),比如你创建一个名为 rpicam - hello.sh 的脚本,内容是实现你想要的摄像头测试功能。然后将这个脚本放在 /usr/local/bin/ 目录下(需要有管理员权限,所以可能会用到 sudo 命令)。这个目录下的脚本可以在终端中直接通过脚本名来调用,就像系统自带的命令一样。例如:

          • 首先,使用文本编辑器(如 nano)创建脚本:

            • sudo nano /usr/local/bin/rpicam - hello.sh
          • 在脚本中写入你的指令内容,比如一些调用摄像头的库函数来实现拍照或者录像等功能的命令序列。假设你用 Python 的 picamera 库来实现简单的拍照功能,脚本内容可能是:
            收起

            bash

            #!/bin/bashpython -c "import picamera; camera = picamera.PiCamera(); camera.start_preview(); camera.capture('test.jpg'); camera.stop_preview()"
            
          • 保存并退出(在 nano 编辑器中,按 Ctrl + X,然后按 Y 确认保存,再按回车键)。

          • 然后需要给这个脚本添加可执行权限:

            • sudo chmod +x /usr/local/bin/rpicam - hello.sh
      • 通过环境变量 PATH 来添加可执行文件路径

        • 如果你的自定义指令所在的文件不在系统默认的可搜索路径(如 /usr/local/bin//usr/bin/ 等)中,你可以通过修改 PATH 环境变量来添加路径。例如,假设你的自定义指令脚本在 /home/pi/my_camera_scripts/ 目录下,你可以在 ~/.bashrc 文件(这是一个在用户登录时会自动执行的配置文件)中添加以下内容:

          • export PATH="$PATH:/home/pi/my_camera_scripts/"
        • 保存 ~/.bashrc 文件后,在终端中执行 source ~/.bashrc 来使修改生效。之后,位于 /home/pi/my_camera_scripts/ 目录下的可执行文件就可以像系统命令一样在终端中调用了。

    3. 使用自定义指令

      • 一旦你添加了自定义指令(比如前面提到的将 rpicam - hello.sh 放在 /usr/local/bin/ 目录下并添加了可执行权限),就可以在终端中像使用其他命令一样使用它。对于 rpicam - hello - t 0 这样的指令,-t 0 很可能是这个自定义命令的参数,用于控制摄像头测试的某种行为。例如,-t 可能代表 “test mode(测试模式)”,0 可能是一个特定的测试选项(比如测试时长为 0 秒,可能是快速测试等)。具体的参数含义要看这个自定义命令的设计文档或者代码实现。

  2. 视频编码

    一、视频编码格式概述

    1. 定义

      • 视频编码格式是指将视频信号(包括图像序列、音频等)进行压缩的一种标准或规范。其目的是在尽可能保证视频质量的情况下,减小视频文件的大小,以便于存储和传输。例如,一部未经压缩的高清电影可能会占用巨大的存储空间,通过合适的视频编码格式压缩后,其大小可以大大减小,方便在网络上传播或存储在有限容量的设备中。
    2. 常见的视频编码格式

      • AVI(Audio Video Interleave)

        • AVI 是一种比较古老的视频编码格式,它将音频和视频数据交错存储在一个文件中。它的优点是兼容性好,在很多早期的视频播放软件和设备上都能播放。但它没有采用高效的压缩算法,所以文件相对较大。例如,一些简单的监控摄像头录制的视频可能会采用 AVI 格式,因为它的简单性和通用性。
      • MPEG(Moving Picture Experts Group)系列

        • MPEG - 1:这是最早的 MPEG 标准,主要用于 VCD(Video Compact Disc)。它的分辨率较低,一般为 352×240(NTSC)或 352×288(PAL),视频质量相对有限,但在当时为视频的数字化存储和播放提供了一种标准的解决方案。
        • MPEG - 2:它被广泛应用于 DVD(Digital Versatile Disc)和数字电视广播。其分辨率和视频质量都比 MPEG - 1 有了很大的提高,可以支持 720×576(PAL)或 720×480(NTSC)等多种分辨率,并且能够提供更好的音频和视频同步效果。
        • MPEG - 4:这是一种更先进的视频编码格式,具有很高的压缩效率。它支持多种视频应用,包括互联网视频流、移动视频等。例如,很多手机拍摄的视频默认采用 MPEG - 4 编码,因为它能够在保证一定视频质量的同时,有效地减小文件大小,便于存储和传输。
      • H.264/AVC(Advanced Video Coding)

        • H.264 是目前应用最广泛的视频编码标准之一。它在视频压缩效率方面表现出色,能够在较低的码率下提供高质量的视频。几乎所有的高清视频播放设备和在线视频平台都支持 H.264 编码。例如,蓝光光盘中的视频内容、YouTube 等视频网站的高清视频很多都是采用 H.264 编码。它通过复杂的算法,如帧间预测、变换编码等技术来减少视频数据的冗余,从而实现高效压缩。
      • H.265/HEVC(High - Efficiency Video Coding)

        • H.265 是 H.264 的继任者,它进一步提高了视频编码的效率。在相同的视频质量下,H.265 编码的视频文件大小可以比 H.264 减少约 50%。这使得它在 4K、8K 等高分辨率视频的存储和传输中具有很大的优势。不过,它的编码和解码过程相对更复杂,对硬件的要求也更高。

    二、视频编码知识

    1. 编码原理

      • 空间冗余:视频中的相邻像素在颜色和亮度等方面往往具有相似性。例如,在一张纯色背景的图像中,相邻像素的颜色几乎相同。编码时可以利用这种相似性,通过预测像素值来减少需要存储的数据量。比如,对于一片蓝色天空的画面部分,只需要记录起始像素的颜色值和后续像素与起始像素的差异情况即可。
      • 时间冗余:视频是由一系列连续的帧组成的,相邻帧之间的内容往往具有很大的相关性。例如,在一个人物说话的视频场景中,相邻帧中人物的背景和大部分身体部分可能几乎没有变化。编码时可以通过比较相邻帧的差异来减少数据量。像帧间预测技术,会根据前面的帧来预测当前帧的内容,只记录与预测帧不同的部分,也就是运动补偿后的残差。
      • 视觉冗余:人的视觉系统对某些细节和颜色变化并不敏感。例如,在一幅画面中,一些微小的颜色渐变或者高频的细节部分,人眼可能很难察觉。编码时可以适当降低这些部分的精度,从而减少数据量,而不会明显影响人眼看到的视频质量。
    2. 编码过程的主要环节

      • 预测:包括帧内预测和帧间预测。帧内预测是在同一帧内进行像素值的预测,主要利用空间冗余。例如,对于一个图像块,可以根据其周围已经编码的像素来预测该块内像素的值。帧间预测则是利用时间冗余,根据相邻帧来预测当前帧的像素值。
      • 变换:通过数学变换(如离散余弦变换 DCT 等)将图像或残差数据从空间域转换到频域。在频域中,数据的能量分布更加集中,便于后续的量化操作。例如,经过 DCT 变换后,图像中的大部分能量会集中在低频部分,高频部分的数据可以相对更简单地处理。
      • 量化:对变换后的系数进行量化,也就是根据一定的量化步长将系数进行舍入处理。量化会导致一定的信息损失,但可以有效减小数据量。例如,对于一些较小的系数,通过量化可以将其设置为 0,从而减少需要存储的数据。
      • 熵编码:对量化后的系数进行熵编码,进一步压缩数据。常用的熵编码方法有哈夫曼编码、算术编码等。熵编码是无损编码,它根据数据出现的概率来分配不同长度的码字,使得出现概率高的数据用较短的码字表示,出现概率低的数据用较长的码字表示,从而达到压缩数据的目的。
    3. 码率和帧率

      • 码率(Bit Rate) :也叫比特率,是指单位时间内传输或存储视频数据的比特数,通常用 kbps(千比特每秒)或 Mbps(兆比特每秒)来表示。码率越高,视频质量通常越高,但文件大小也会越大。例如,一个码率为 2Mbps 的视频比一个码率为 1Mbps 的视频在相同分辨率和帧率下质量可能更好,但占用的存储空间或网络带宽也会更多。
      • 帧率(Frame Rate) :是指视频中每秒包含的帧数,单位是 fps(帧每秒)。常见的帧率有 24fps、30fps、60fps 等。帧率越高,视频的流畅度越高。例如,电影通常采用 24fps,看起来比较自然流畅;而一些高动态的游戏视频可能会采用 60fps 甚至更高的帧率,以提供更平滑的视觉体验。在视频编码中,帧率也会影响码率,因为帧率越高,需要编码和传输的帧就越多,码率也可能相应提高
  • 待分类

    用户发帖时如果不填标签,则默认加上“待分类”。这样做是为了减少用户发帖的负担,同时也减少运营维护的工作量。具有帖子更新权限的用户可以帮助社区进行帖子整理,让大家可以更方便地找到所需内容。这里是关于这样设计的一些思考,欢迎讨论。

    3 引用 • -304 回帖 • 4 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...