将相机模块或高品质相机(HQ Camera)连接到树莓派上,你就可以拍摄高分辨率的照片和视频,并创建惊人的计算机视觉项目。
image.png
如果你曾经想建立一个可以看到东西的项目——在机器人领域被称为计算机视觉,那么树莓派的可选相机模块或新的高品质相机是一个很好的起点。相机模块或高品质相机是一块带有细带电缆的小方形电路板,它可以连接到树莓派上的相机串行接口(CSI)端口(Raspberry Pi 400上不提供),并提供高分辨率的静止图像和视频信号,可以按原样使用或集成到你自己的程序中。

相机类型

image.png 有三种类型的树莓派相机可供选择:标准相机模块,“NoIR”版本,以及高品质(HQ)相机。如果你想在光线充足的环境中拍摄普通的照片和视频,你应该使用标准相机模块;如果你想使用特殊的镜头,并寻求最佳的图片质量,请使用 HQ 相机模块。NoIR 相机模块——之所以被称为 NoIR,因为“正常”树莓派相机的镜头上有一个 IR 红外滤光片,可以阻挡我们的红外光。相机的 NoR 版本则省略了该滤镜。所以 NoIR 是为与红外光源一起使用而设计的,可以在完全黑暗的环境中拍摄照片和视频。如果你正在建造一个巢箱、安全摄像机或其他涉及夜视的项目,你就需要 NoIR 版本——但要记得同时购买一个红外光源。

标准相机模块和 NoIR 树莓派相机模块都是基于索尼 IMX219 图像传感器。这是一个800万像素的传感器,这意味着它可以拍摄多达800万像素(宽3280像素、高2464像素)的照片。除了静态图像,相机模块还能以每秒30帧(30 fps)的速度捕捉全高清分辨率的视频片段。为了获得更流畅的运动画面,甚至创造慢动作效果,可以通过降低分辨率将相机设置为以更高的帧率进行拍摄。使用60帧/秒可用于拍摄720p 的视频片段,而高达90帧/秒可用于拍摄 480p(VGA)的片段。
高品质相机使用1230万像素的索尼 IMX477 传感器,它也比标准和无红外相机模块中的传感器大——这意味着它可以收集更多的光线,从而获得更高品质的图像。但与相机模块不同的是,高品质相机不包括镜头,没有镜头就不能拍摄任何照片或视频。你可以使用任何带有 C 或 CS 卡口的镜头;其他镜头卡口可以用适当的 C 或 CS 卡口适配器来使用。关于如何安装镜头的细节,见附录 F:高品质相机

树莓派400 image.png 不幸的是,树莓派相机模块与 Raspberry Pi 400 不兼容。 你可以使用 SB 网络摄像头作为替代,但这将无法使用 Raspberry Pi OS 中包含的相机模块专用软件工具。

安装相机

像任何硬件插件一样,相机模块或高品质相机只能在电源关闭和拔掉电源线的情况下与树莓派连接或断开连接。如果你的树莓派是开着的,从树莓菜单中选择关机,等待它断电,然后拔掉它。
在大多数情况下,提供的带状电缆将已经连接到相机模块或高品质相机;如果没有,把你的相机板倒过来,让传感器在底部,寻找一个扁平的塑料连接器。小心地用指甲勾住伸出的边缘,向外拉,直到连接器被拉出一部分。将带状电缆,银色边缘向下,蓝色塑料朝上,滑到你刚刚拉出的挡板下面,然后轻轻地将挡板推回原位,发出咔嚓一声,如下图所示;你使用电缆的哪一端并不重要。如果电缆安装正确,它将是笔直的,只要你轻轻一拽就不会出来;如果不是,就把挡板拉出来再试一次。

image.png
将带状电缆连接到相机模块上。

用同样的方法安装电缆的另一端。找到树莓派上的 Camera(或 CSI )端口,将挡板轻轻往上拉。如果你的树莓派是安装在一个外壳里,你可能会发现先把它拆下来比较容易。将树莓派放置在 HDMI 端口面向你的位置,将带状电缆滑入,使银色边缘在你的左边,蓝色塑料在你的右边,如下图所示,然后轻轻地将挡板推回原处。如果电缆安装正确,它将是笔直的,如果你轻轻拉一下,它应该不会出来;如果不是,就把盖板拉出来再试一次。
image.png
将带状电缆连接到树莓派的相机/ CSI 端口上。

相机模块的镜头上覆盖有一小块蓝色塑料,以保护它在制造、运输和安装过程中不被划伤。找到这一小片塑料,把它从镜头上轻轻地拉下来,就可以准备好使用相机了。

调整焦点

第八章:树莓派相机模块 - 图6 相机模块通常提供一个小的可转动的塑料轮圈,用于调整镜头的焦点。虽然工厂设置的焦点通常是完美的,但如果你用相机进行非常近距离的工作,你可以把转轮滑动镜头上,轻轻地扭转转轮来手动调整焦点。关于高品质相机的对焦,见附录 F

将电源重新连接到树莓派上,让它加载树莓派操作系统。在你可以使用相机之前,你需要告诉树莓派它已经连接了一个相机:打开树莓图标菜单,选择“首选项”,然后点击 Raspberry Pi Configuration(树莓派设置)。当该工具加载完毕后,点击 Interfaces 接口选项卡,在列表中找到 Camera (相机)条目,并点击“已启用”左边的圆形单选按钮,将其打开(见下图)。点击 OK(确定),该工具会提示你重新启动你的树莓派。这样做,你的相机就可以开始使用了
image.png
你需要在树莓派配置中启用摄像头。

测试相机

为了确认你的相机模块或高品质相机已经正确安装,以及你已经在树莓派配置工具中启用了接口,你可以使用 raspistill 工具,它和 raspivid (用于视频)都是为了使用树莓派的命令行界面(CLI)从相机中捕捉图像。
与你到目前为止所使用的程序不同,你不会在菜单中找到 raspistill。相反,点击树莓图标加载菜单,选择附件类别,然后点击终端,会出现一个黑色的窗口,里面有绿色和蓝色的文字,如下图所示:这就是终端,它允许你访问命令行界面。
image.png
打开一个终端窗口输入命令。

要测试摄像机,请在终端中输入以下内容。

  1. raspistill -o test.jpg

一旦你按下回车键,你会看到屏幕上出现一张摄像机看到的大图片,如下图所示。这被称为实时预览,除非你告诉 raspistill,否则它将持续5秒钟。这5秒钟结束后,相机将捕捉一张静止的图片,并以 test.jpg 为名保存在你的主文件夹中。如果你想捕捉另一张,请再次键入相同的命令——但要确保在 -o 之后修改输出文件的名称,否则刚才拍摄的那张照片会被覆盖。
image.png
相机的实时预览。

如果实时预览的画面是颠倒的,你需要告诉 raspistill 相机画面需要旋转。相机模块的设计是让带状电缆从底部边缘出来;如果它从侧面或顶部出来,就像一些第三方的相机安装配件一样,你可以使用 -rot 开关将图像旋转90、 180 或 270 度。对于电缆从顶部出来的相机安装,只需使用以下命令。

  1. raspistill -rot 180 -o test.jpg

如果带状电缆是从右侧边缘出来的,则使用90度的旋转值;如果它是从左侧边缘出来的,则使用270度。如果你的原始捕获的角度不对,再试一次使用 -rot 开关来纠正它。

想要看你的图片,从树莓菜单的附件类别中打开“文件管理器”:你拍摄的图片名为 test.jpg,会放在你的 home/pi 文件夹中。在文件列表中找到它,然后双击它,在图像浏览器中加载它,如下图所示。你还可以把图片附在电子邮件中,通过浏览器上传到网站上,或者把它拖到外部存储设备中。
image.png
打开捕获的图像。

介绍 picamera

控制相机模块或高品质相机的最灵活的方法是使用 Python,通过方便的 picamera 库。这使你能够完全控制相机的预览、图片和视频捕获能力,并允许你将它们整合到你自己的程序中——甚至通过 GPIO Zero 库将它们与使用GPIO 模块的程序结合起来

python编程

image.png 本章中的项目假定有使用 Python 编程语言、Thonny IDE 和树莓派的 GPIO 引脚的经验。如果你还没有这样做,请先完成《第5章 用 Python 编程》和《第6章 用 Scratch 和 Python 进行物理计算》中的项目。

如果终端仍然打开,点击窗口右上方的 X 图标关闭终端,然后从树莓菜单的“编程”类别中加载 Thonny。把你的新项目保存为 Camera,然后在脚本区输入以下内容,开始导入你的程序所需的库。

  1. from picamera import PiCamera
  2. from time import sleep
  3. camera = PiCamera()

最后一行允许你使用相机函数来控制相机模块或高品质相机。要开始,请输入以下内容。

  1. camera.start_preview()
  2. sleep(10)
  3. camera.stop_preview()

点击“Run”图标image.png,你的桌面会消失;在它的位置上,你会看到摄像头所能看到的全屏预览,如下图所示。试着移动摄像头,或者在镜头前挥动你的手,你会看到屏幕上的图片也随之改变。10秒钟后,预览将关闭,你的程序会结束,但是,与刚才 raspistill 的预览不同,结束之后不会保存任何图片。
image.png
摄像机视图的全屏实时预览。

如果你的预览是错误的,你可以旋转图像,让它重新以正确的方式出现。就在camera = PiCamera()这一行的下面,输入。

  1. camera.rotation = 180

如果刚才预览是上下颠倒的,这一行代码将会使画面恢复正常。和 raspistill 一样,camera.rotation 可以让你将图像旋转 90、180 或 270 度,这取决于电缆是从相机模块的右边、上面还是左边出来的。记住在你编写的任何程序开始时使用 camera.rotation,以避免捕捉到的图像或视频是错误的。

捕捉静态图片

为了捕捉到图片,而不仅仅是显示实时预览,你的程序需要进行修改。首先要减少预览的延迟:找到sleep(10)这行,并将其数值改小。

  1. sleep(5)

在这一行的正下方,添加以下内容。

  1. camera.capture('/home/pi/Desktop/image.jpg')

预留相机调整的时间

image.png 当相机处于预览模式时,它会分析视频,看是否需要调整其设置以获得最佳质量。如果你在一个非常黑暗或非常明亮的环境中,你会看到这种情况——预览开始时无法看到,然后很快变得清晰。为了给相机以调整的时间,在捕捉图像之前,总是在你的程序中添加至少2秒钟的预览期。

camera.capture 函数则告诉 Python 保存一个静止的图像,它不仅需要知道这个图像应该被如何命名,还需要知道它应该被保存在什么文件夹中。在这个例子中,你需要把它保存到桌面上——以便在废纸篓的下面就能找到它。如果 Thonny 窗口碍事,只要点击并拖动标题栏就可以移动它。双击该文件可以看到你捕捉到的图像,如下图所示。祝贺你:你已经对一个相机进行了编程!
image.png
打开捕获的图像。

捕捉移动视频

除了拍摄静态图像外,你还可以捕捉视频。删除camera.start_preview()camera.stop_preview()这两行之间的所有内容,然后在camera.start_preview()面输入以下内容。

  1. camera.start_recording('/home/pi/Desktop/video.h264')
  2. sleep(10)
  3. camera.stop_recording()

运行后摄像机预览将出现,和以前一样,但这次它也将被记录到桌面上的一个文件。视频记录会持续你告诉 Python 的10 秒睡眠时间——这期间可以考虑在摄像机前来段尬舞,使视频变得有趣,然后,当预览关闭后,你会在桌面上发现你的视频文件。
要播放视频,只需双击桌面上的 video.h264 文件,视频将会开始播放——如果你跳了舞,你会在回放里看到它。视频播放完毕后,播放器软件将退出,并在终端显示一条友好信息。恭喜你:你现在可以用你的树莓派相机模块或高品质相机来捕捉视频了!
image.png

按键式定格动画

利用你在本章中所学到的知识,以及你在第6章 “物理计算”中关于如何将硬件连接到树莓派的 GPIO 引脚的知识,现在是时候尝试一些有挑战的项目了:你自己的定格动画工作室。
定格动画是指对静止的物体(如汽车模型或动作人物)拍摄大量的照片,并在每张照片之间稍微移动这些物体的运动过程。虽然物体在任何照片中都不会移动,但如果你快速地一张接一张地播放,看起来就像它们在移动,快慢随你喜欢。

在这个项目中,你需要一个按钮开关,一块面包板,一根公对公(M2M)跳线,和一对公对母(M2F)跳线。如果你没有面包板,你可以用母对母(F2F)的跳线代替连接开关,但它会更难按。如果你需要回忆这些组件中的任何一个,请翻到《第六章:用 Scratch 和 Python 进行物理计算》。你还需要制作动画的对象:这些对象可以是任何东西,从一团黏土到一辆玩具车或一个动作人物。
首先创建电路:将按钮添加到面包板上,然后用一根公对母跳线将面包板的地线连接到树莓派的地线(下图中标有 GND )。用一根公对公的跳线将开关的一条腿连接到面包板的地轨上,然后用一根公对公的跳线将开关的另一条腿连接到 GPIO 引脚2(下图中标有 GP2)。
image.png
按钮和 GPIO 引脚的接线图。

在 Thonny 中创建一个新项目,并将其保存为 “定格动画”。首先导入并设置你需要的库,以便使用摄像机和 GPIO 端口:

  1. from picamera import PiCamera
  2. from gpiozero import Button
  3. camera = PiCamera()
  4. button = Button(2)

接下来,输入以下内容:

  1. camera.start_preview()
  2. button.wait_for_press()
  3. camera.capture('/home/pi/Desktop/image.jpg')
  4. camera.stop_preview()

点击“Run”图标image.png,你会看到你的相机镜头看到的预览画面。预览画面将停留在屏幕上,直到你按下按钮开关:现在按下它,预览将在你的程序将图片保存到桌面后关闭。找到这张名为 image.jpg 的图片,然后双击打开它,确认程序正在工作。
定格动画涉及到创建大量的静止图像,当它们全部组合在一起时,会给人以运动的印象。把所有这些单独的图片放在你的桌面上会很乱,所以你需要一个文件夹来存储它们。右键单击桌面上任何没有文件或图标的地方,然后选择New Folder …(见下图)。给文件夹命名为 animation(动画),全部用小写字母,然后点击“确定”按钮。

image.png
为您捕获的图像创建一个新的文件夹。

每次为你的动画捕捉图片时都要重新启动程序会很麻烦,所以你需要把它改为循环运行。不过,与你以前创建的循环不同,这个循环需要一种优雅地关闭的方式——否则,如果你在相机预览显示时停止程序,你就无法再看到桌面了。要做到这一点,你需要使用两个特殊的指令:tryexcept

首先删除 camera.start_preview()之后的所有内容,然后输入。

  1. frame = 1

这句代码将创建一个新的变量 frame,你的程序将用它来存储当前的帧数。你很快就会使用这个变量来确保你每次都保存一个新的文件;如果没有这个变量,你每次按下按钮都会覆盖上一次拍摄的照片。
接下来,通过输入以下内容设置你的循环。

  1. while True:
  2. try:

新指令 try 告诉 Python 运行里面的任何代码——这将是捕获图像的代码。键入下面内容:

  1. button.wait_for_press()
  2. camera.capture('/home/pi/Desktop/animation/frame%03d.jpg' % frame)
  3. frame += 1

在这三行代码中,有几个巧妙的小技巧。第一个是在捕获的文件名中:使用 %03d 告诉 Python 采用一个数字,并在前面添加尽可能多的零,以使其成为三位数的长度。因此,“1”变成了“001”,“2”变成“002”,而“10”变成“010”。你需要在你的程序中这样操做,以确保文件有正确的顺序,并确保你不会在你已经保存的文件上覆盖。

该行末尾的 % frame 告诉 Python 在文件名中使用框架变量的编号。为了确保每个文件都是唯一的,最后一行—— frame += 1 将 frame 变量增加 1。第一次按下按钮, frame 将从 1 增加到 2;下一次,从 2 增加到 3;以此类推。
不过,目前你的代码在你拍完照片后不会主动退出,会一直保持循环。为了实现这一点,你需要为你的 try 添加一个例外。输入下面的内容,记住在第一行去掉一级缩进,这样 Python 就知道它不是 try 的一部分:

  1. except KeyboardInterrupt:
  2. camera.stop_preview()
  3. break

你完成的程序将看起来像这样:

  1. from picamera import PiCamera
  2. from time import sleep
  3. from gpiozero import Button
  4. camera = PiCamera()
  5. button = Button(2)
  6. camera.start_preview()
  7. frame = 1
  8. while True:
  9. try:
  10. button.wait_for_press()
  11. camera.capture('/home/pi/Desktop/animation/frame%03d.jpg'
  12. % frame)
  13. frame += 1
  14. except KeyboardInterrupt:
  15. camera.stop_preview()
  16. break

试着点击“Run”图标image.png”,但不要按按钮,而是按键盘上的 CTRL 和 C 键。你不需要同时按两个键:只要按住 CTRL,按下并释放 C,然后释放 CTRL。这两个键会作为一个中断,告诉 Python 停止它正在做的事情。如果没有except KeyboardInterrupt:这一行,Python 会立即退出,让摄像机预览挡住你的屏幕;但是有了这一行,Python 会运行里面的任何代码——在这种情况下,代码告诉它停止摄像机预览并干净地退出。
现在你已经准备好开始捕捉你的定格动画了! 将摄像机模块或高品质摄像机放置在它能看到你要制作动画的物体的地方,并确保它不会移动——如果摄像机移动,它就会破坏效果。把你的对象放在它们的起始位置,然后点击运行来启动你的程序。在预览中检查画面符合预期后按下按钮来捕捉第一帧。
稍微移动物体——你在两帧之间移动得越少,完成的动画就越平滑,然后再次按下按钮,捕捉另一帧……如此重复直到你的动画完成:你捕捉的帧越多,动画就越长。
完成后,按 CTRL+C 键关闭程序,然后双击桌面上的动画文件夹,查看你捕捉的图片(见下图)。双击任何一张图片可以打开它,看到它的更多细节!
image.png
文件夹中捕获的图片。

不过,目前你所拥有的只是一个装满静止图像的文件夹。要创建一个动画,你需要把它们变成一个视频。要做到这一点,点击树莓图标加载菜单,选择“附件”,然后点击“LX 终端”。这将打开一个命令行界面,在附录 C 中有更详细的介绍,它允许你向树莓派输入命令。终端加载时,先进入到你所记录的文件夹中,键入。

  1. cd Desktop/animation

注意,“Desktop”中的“D”要用大写字母;树莓派操作系统是所谓的大小写敏感的,这意味着如果你输入的命令或文件夹名称与原来的写法不一致,它就不会起作用。一旦你改变了文件夹,输入以下内容。

  1. ffmpeg -i frame%03d.jpg -r 10 animation.h264

这将使用一个叫做 ffmpeg 的程序,将文件夹中的静止图像转换成一个叫做 animation.h264 的视频。长度取决于你拍了多少张照片,这个过程可能需要几分钟;当你看到终端提示重新出现时,你就知道它已经完成了。要播放视频,在你的动画文件夹中找到 animation.h264 文件,双击它来打开它。或者,你可以通过输入以下内容从终端播放它。

  1. omxplayer animation.h264

一旦视频加载完毕,你就会看到你的定格动画活了过来。恭喜你:你已经把你的树莓派变成了一个强大的动画工作室!

如果你的动画进行得太快或太慢,把 ffmpeg 命令中的-r 10部分改为一个较低或较高的数字:这是帧率,或者说一秒钟的视频中有多少静止图像。一个较低的数字会使你的动画运行得更慢,但看起来不那么流畅;一个较高的数字看起来更流畅,但会使动画运行得更快。
如果你想保存你的视频,一定要把它从桌面上拖到你的“Videos”文件夹中;否则,下次你运行你的程序时,你将最终覆盖该文件!

高级相机设置

如果你需要对树莓派相机模块或高品质相机进行更多控制,你可以使用 Python picamera 库来访问各种设置。这些设置以及它们的默认值详见下文,以便纳入你自己的程序中。

camera.awb_mode = 'auto'
这行代码设置相机为自动白平衡模式,可以设置为以下任何一种模式:off(关闭), auto(自动), sunlight(阳光), cloudy(阴天), shade(阴影), tungsten(钨丝灯), fluorescent(荧光灯), incandescent(白炽灯), flash(闪光灯), 或 horizon(水平线)。如果你发现你的照片和视频看起来有点蓝或黄,请尝试不同的模式。

camera.brightness = 50
这行代码是设置相机图像的亮度,值域从最暗的0到最亮的100。

camera.color_effects = None
这行代码将改变摄像机当前使用的颜色效果。通常情况下,这个设置应该是独立的,但如果你提供一对数字,你可以改变摄像机记录颜色的方式:尝试(128,128)来创建一个黑白图像。

camera.contrast = 0
这行代码是设置图像的对比度。一个较高的数字会使事物看起来更有鲜亮;一个较低的数字会使画面看起来更灰。你可以使用 -100(表示最小对比度)到 100(表示最大对比度)之间的任何数字。

camera.crop = (0.0, 0.0, 1.0, 1.0)
这行代码允许你对图像进行裁剪,从侧面和顶部切下部分图像,只捕捉你需要的部分。这些数字代表X坐标、Y坐标、宽度和高度,默认情况下是捕捉整个图像。试着减少最后两个数字,0.5和0.5是一个好的起点,看看这个设置有什么效果。

camera.exposure_compensation = 0
这行代码设置了相机的曝光补偿,允许你手动控制每张图像的光量。与改变亮度设置不同,这实际上是控制相机本身。值域从 -25(非常暗的图像)到 25(非常亮的图像)。

camera.exposure_mode = 'auto'
这行代码设置了相机模块或高品质相机的曝光模式,用来决定图像应如何曝光的逻辑。可能的模式有:off(关闭)、auto(自动)、night(夜间)、backlight(背光)、spotlight(聚光灯)、sports(运动)、snow(雪地)、beach(海滩)、verylong(长曝光)、fixedfps(固定 fps)、antishake(防抖)和 fireworks(焰火)。

camera.framerate = 30
这行代码设置了为创建视频而每秒捕获的图像数量或帧率。较高的帧率可以创建一个更平滑的视频,但会占用更多的存储空间。较高的帧率需要使用较低的分辨率,你可以通过 camera.resolution 来设置画面分辨率。

camera.hflip = False
当设置为 True 时,这将使摄像机图像在水平或X轴上翻转。

camera.image_effect = 'none'
这行代码将对视频流应用一系列图像效果中的一种,在预览以及保存的图像和视频中可见。可能的效果有:blur(模糊), cartoon(卡通), colorbalance(色彩平衡), colorpoint(色点), colorswap(色彩交换), deinterlace1(去交错1), deinterlace2(去交错2), denoise(去噪), emboss(浮雕), film(胶片), gpen, hatch(图案填充), negative(负片), none(无), oilpaint(油画), pastel(粉彩), posterise(海报化), saturation(饱和度), sketch(草图), solarize(日晒), washedout(水洗)和 watercolor(水彩画)。

camera.ISO = 0
这行代码将改变相机的 ISO 设置,它影响相机对光线的敏感程度。默认情况下,相机会根据可用光线的情况自动调整。你可以使用以下数值之一自己设置 ISO:100, 200, 320, 400, 500, 640, 800。ISO 越高,相机在低光环境下的表现就越好,但拍摄的图像或视频的颗粒感就越大。

camera.meter_mode = 'average'
这行代码控制相机在设置曝光时如何决定可用的光量。默认情况下,对整个画面的可用光量进行平均;其他可能的模式是 backlit(背光), matrix(矩阵)和 spot(定点)。

camera.resolution = (1920, 1080)
这行代码设置了拍摄的图片或视频的分辨率,用两个数字表示宽度和高度。较低的分辨率会占用较少的存储空间,并允许你使用较高的帧率;较高的分辨率质量较好,但会占用较多的存储空间。

camera.rotation = 0
这行代码是控制图像的旋转,从0度到90、180和270度。如果你不能将摄像机定位到让带状电缆从底部出来,就可以用这个。

camera.saturation = 0
这可以控制图像的饱和度,或者说色彩的鲜艳程度。值域在 -100 到 100 之间。

camera.sharpness = 0
这控制了图像的锐度。值域是 -100 到 100。

camera.shutter_speed = 0
这控制了捕捉图像和视频时快门打开和关闭的速度。你可以以微秒为单位手动设置快门速度,较长的快门速度在光线较弱时效果更好,而较快的快门速度在光线较强时效果更好。通常情况下,这应该留在其默认的自动设置上。

camera.vflip = False
当设置为 True 时,这将使相机图像在垂直或 Y 轴上翻转。

camera.video_stabilization = False
当设置为 True 时,这将打开视频稳定功能。在摄像机模块或高品质摄像机在你拍摄时会移动的情况下使用,例如它被连接到运动的机器人身上或被携带时,以减少拍摄视频时的抖动。

关于这些设置的更多信息,以及这里没有记载的其他设置,可以在 picamera.readthedocs.io 找到。