捕获图像 - Raspberry Pi 在本课程的这一部分中,你将为你的Raspberry Pi添加一个摄像头传感器,并从中读取图像。 硬件 Raspberry Pi需要一个摄像头。 你将使用的摄像头是一个Raspberry Pi摄像头模块。这个摄像头是专为Raspberry Pi设计的,并通过Pi上的专用连接器连接。 这个摄像头使用了Camera Serial Interface,即移动行业处理器接口联盟(MIPI)制定的协议,称为MIPI-CSI。这是一种专门用于传输图像的协议。 连接摄像头 摄像头可以通过一条扁平电缆连接到Raspberry Pi。 任务 - 连接摄像头 一张Raspberry Pi摄像头 关闭Pi电源。 将随摄像头附带的扁平电缆连接到摄像头。
在本课程的这一部分中,你将为你的Raspberry Pi添加一个摄像头传感器,并从中读取图像。
Raspberry Pi需要一个摄像头。
你将使用的摄像头是一个Raspberry Pi摄像头模块。这个摄像头是专为Raspberry Pi设计的,并通过Pi上的专用连接器连接。
这个摄像头使用了Camera Serial Interface,即移动行业处理器接口联盟(MIPI)制定的协议,称为MIPI-CSI。这是一种专门用于传输图像的协议。
摄像头可以通过一条扁平电缆连接到Raspberry Pi。

关闭Pi电源。
将随摄像头附带的扁平电缆连接到摄像头。为此,轻轻拉出插槽中的黑色塑料夹,然后将电缆插入插槽,蓝色的一面朝向远离镜头的方向,金属针条面向镜头。完全插入后,再把黑色塑料夹推回原位。
你可以在Raspberry Pi摄像头模块入门文档中找到展示如何打开夹子并插入电缆的动画。

移除Pi上的Grove Base Hat。
将扁平电缆穿过Grove Base Hat上的摄像头插槽。确保电缆的蓝色面朝向标有A0、A1等模拟端口的方向。

将扁平电缆插入Pi上的摄像头插槽。再次,拉起黑色塑料夹,插入电缆,然后将其推回原位。电缆的蓝色面应面向USB和以太网端口。

重新安装Grove Base Hat。
现在可以使用Raspberry Pi摄像头库来编程Raspberry Pi以使用摄像头。
不幸的是,在Raspberry Pi OS Bullseye发布后,随操作系统一起提供的摄像头软件发生了变化,这意味着默认情况下PiCamera不再工作。有一个替代品正在开发中,称为PiCamera2,但目前还不能使用。
目前,你可以将Pi设置为旧版摄像头模式以允许PiCamera工作。摄像头插槽默认也是禁用的,但是启用旧版摄像头软件会自动启用插槽。
打开Pi电源并等待其启动。
在Pi上直接启动VS Code,或者通过Remote SSH扩展连接。
从终端运行以下命令:
sudo raspi-config nonint do_legacy 0 sudo reboot
这将切换一个设置以启用旧版摄像头软件,然后重启Pi以使该设置生效。
等待Pi重启,然后重新启动VS Code。
编程设备。
从终端创建一个新的文件夹在pi users home directory called fruit-quality-detector. Create a file in this folder called app.py。
在VS Code中打开此文件夹。
要与摄像头交互,可以使用PiCamera Python库。使用以下命令安装此库的Pip包:
pip3 install picamera
在app.py文件中添加以下代码:
import io import time from picamera import PiCamera
此代码导入了一些所需的库,包括PiCamera库。
在这之下添加以下代码以初始化摄像头:
camera = PiCamera() camera.resolution = (640, 480) camera.rotation = 0 time.sleep(2)
此代码创建了一个PiCamera对象,并将分辨率设置为640x480。虽然支持更高的分辨率(最高可达3280x2464),但图像分类器在较小的图像(如227x227)上效果更好,因此没有必要捕获和发送更大的图像。
camera.rotation = 0行设置了图像的旋转角度。扁平电缆从摄像头底部进入,但如果为了更容易对准要分类的物品而旋转了摄像头,那么可以将此行更改为所需的旋转度数。

例如,如果你将扁平电缆悬挂在某物上方,使其位于摄像头顶部,则可以将旋转设置为180度:
camera.rotation = 180
摄像头启动需要几秒钟,因此使用了time.sleep(2)
在这之下添加以下代码以将图像作为二进制数据捕获:
image = io.BytesIO() camera.capture(image, 'jpeg') image.seek(0)
这段代码创建了一个BytesIO对象,并将文件位置移回开头,以便稍后读取所有数据。
在这之下添加以下代码以将图像保存到文件中:
with open(https://www.aiknowledge.cn/images/初学者的IOT开发课程/'image.webp) as image_file: image_file.write(image.read())
https://www.aiknowledge.cn/images/初学者的IOT开发课程/ 这段代码打开一个名为`image.webp
你可以在code-camera/pi文件夹中找到这段代码。
你的摄像头程序成功了!
声明:
本文件灏天文库团队进行了翻译。尽管我们力求准确,但请注意,翻译可能包含错误或不准确之处。原文档以其原始语言为准。我们不对因使用此翻译而产生的任何误解或误译负责。