7.2 KiB
捕捉图像 - 树莓派
在本课程的这一部分,你将为树莓派添加一个摄像头传感器,并从中读取图像。
硬件
树莓派需要一个摄像头。
你将使用的摄像头是 树莓派摄像头模块。这个摄像头专为树莓派设计,通过树莓派上的专用连接器连接。
💁 这个摄像头使用 摄像头串行接口(Camera Serial Interface),一种由移动产业处理器接口联盟开发的协议,简称 MIPI-CSI。这是一种专用的图像传输协议。
连接摄像头
摄像头可以通过一条扁平电缆连接到树莓派。
任务 - 连接摄像头
-
关闭树莓派的电源。
-
将摄像头附带的扁平电缆连接到摄像头上。为此,轻轻拉动插座中的黑色塑料夹,使其稍微弹出,然后将电缆滑入插座,蓝色一面朝向镜头外侧,金属针脚条朝向镜头。插入到位后,将黑色塑料夹推回原位。
你可以在 树莓派摄像头模块入门文档 中找到一个动画,展示如何打开夹子并插入电缆。
-
从树莓派上移除 Grove Base Hat。
-
将扁平电缆穿过 Grove Base Hat 的摄像头插槽。确保电缆的蓝色一面朝向标有 A0、A1 等的模拟端口。
-
将扁平电缆插入树莓派上的摄像头端口。同样,拉起黑色塑料夹,插入电缆,然后将夹子推回。电缆的蓝色一面应朝向 USB 和以太网端口。
-
重新安装 Grove Base Hat。
编程摄像头
现在可以使用 PiCamera Python 库对树莓派进行编程以使用摄像头。
任务 - 启用传统摄像头模式
不幸的是,随着树莓派操作系统 Bullseye 的发布,操作系统附带的摄像头软件发生了变化,默认情况下 PiCamera 不再工作。目前正在开发一个替代方案,名为 PiCamera2,但尚未准备好使用。
目前,你可以将树莓派设置为传统摄像头模式,以使 PiCamera 工作。摄像头插座默认也是禁用的,但启用传统摄像头软件会自动启用插座。
-
启动树莓派并等待其完成启动。
-
启动 VS Code,可以直接在树莓派上运行,也可以通过 Remote SSH 扩展连接。
-
在终端中运行以下命令:
sudo raspi-config nonint do_legacy 0 sudo reboot
这将切换设置以启用传统摄像头软件,然后重启树莓派以使设置生效。
-
等待树莓派重启,然后重新启动 VS Code。
任务 - 编程摄像头
对设备进行编程。
-
在终端中,在
pi
用户的主目录中创建一个名为fruit-quality-detector
的新文件夹。在此文件夹中创建一个名为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
对象来存储二进制数据。图像以 JPEG 文件的形式从摄像头读取并存储在此对象中。此对象有一个位置指示器,用于指示数据中的当前位置,以便需要时可以将更多数据写入末尾,因此image.seek(0)
行将位置移回起始位置,以便稍后可以读取所有数据。 -
在此代码下方添加以下代码以将图像保存到文件:
with open('image.jpg', 'wb') as image_file: image_file.write(image.read())
这段代码打开一个名为
image.jpg
的文件进行写入,然后从BytesIO
对象中读取所有数据并写入该文件。💁 你可以直接将图像捕获到文件,而不是使用
BytesIO
对象,只需将文件名传递给camera.capture
调用即可。使用BytesIO
对象的原因是稍后在本课程中你可以将图像发送到图像分类器。 -
将摄像头对准某物并运行此代码。
-
图像将被捕获并保存为当前文件夹中的
image.jpg
。你将在 VS Code 的资源管理器中看到此文件。选择该文件以查看图像。如果需要旋转,请根据需要更新camera.rotation = 0
行并重新拍摄照片。
💁 你可以在 code-camera/pi 文件夹中找到此代码。
😀 你的摄像头程序运行成功!
免责声明:
本文档使用AI翻译服务 Co-op Translator 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原文档的原始语言版本作为权威来源。对于关键信息,建议使用专业人工翻译。我们对于因使用本翻译而引起的任何误解或误读不承担责任。