捕获图像-RaspberryPi


文档摘要

捕获图像 - 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摄像头模块。这个摄像头是专为Raspberry Pi设计的,并通过Pi上的专用连接器连接。

这个摄像头使用了Camera Serial Interface,即移动行业处理器接口联盟(MIPI)制定的协议,称为MIPI-CSI。这是一种专门用于传输图像的协议。

连接摄像头

摄像头可以通过一条扁平电缆连接到Raspberry Pi。

任务 - 连接摄像头

一张Raspberry Pi摄像头

  1. 关闭Pi电源。

  2. 将随摄像头附带的扁平电缆连接到摄像头。为此,轻轻拉出插槽中的黑色塑料夹,然后将电缆插入插槽,蓝色的一面朝向远离镜头的方向,金属针条面向镜头。完全插入后,再把黑色塑料夹推回原位。

    你可以在Raspberry Pi摄像头模块入门文档中找到展示如何打开夹子并插入电缆的动画。

    扁平电缆插入摄像头模块

  3. 移除Pi上的Grove Base Hat。

  4. 将扁平电缆穿过Grove Base Hat上的摄像头插槽。确保电缆的蓝色面朝向标有A0A1等模拟端口的方向。

    扁平电缆穿过Grove Base Hat

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

    扁平电缆连接到Pi上的摄像头插槽

  6. 重新安装Grove Base Hat。

编程摄像头

现在可以使用Raspberry Pi摄像头库来编程Raspberry Pi以使用摄像头。

任务 - 启用旧版摄像头模式

不幸的是,在Raspberry Pi OS Bullseye发布后,随操作系统一起提供的摄像头软件发生了变化,这意味着默认情况下PiCamera不再工作。有一个替代品正在开发中,称为PiCamera2,但目前还不能使用。

目前,你可以将Pi设置为旧版摄像头模式以允许PiCamera工作。摄像头插槽默认也是禁用的,但是启用旧版摄像头软件会自动启用插槽。

  1. 打开Pi电源并等待其启动。

  2. 在Pi上直接启动VS Code,或者通过Remote SSH扩展连接。

  3. 从终端运行以下命令:

    sudo raspi-config nonint do_legacy 0 sudo reboot

    这将切换一个设置以启用旧版摄像头软件,然后重启Pi以使该设置生效。

  4. 等待Pi重启,然后重新启动VS Code。

任务 - 编程摄像头

编程设备。

  1. 从终端创建一个新的文件夹在pi users home directory called fruit-quality-detector. Create a file in this folder called app.py

  2. 在VS Code中打开此文件夹。

  3. 要与摄像头交互,可以使用PiCamera Python库。使用以下命令安装此库的Pip包:

    pip3 install picamera
  4. app.py文件中添加以下代码:

    import io import time from picamera import PiCamera

    此代码导入了一些所需的库,包括PiCamera库。

  5. 在这之下添加以下代码以初始化摄像头:

    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)

  6. 在这之下添加以下代码以将图像作为二进制数据捕获:

    image = io.BytesIO() camera.capture(image, 'jpeg') image.seek(0)

    这段代码创建了一个BytesIO对象,并将文件位置移回开头,以便稍后读取所有数据。

  7. 在这之下添加以下代码以将图像保存到文件中:

    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文件夹中找到这段代码。

你的摄像头程序成功了!

声明:
本文件灏天文库团队进行了翻译。尽管我们力求准确,但请注意,翻译可能包含错误或不准确之处。原文档以其原始语言为准。我们不对因使用此翻译而产生的任何误解或误译负责。


作者与出处
原作者: microsoft
来源:microsoft
许可证:MIT
整理: 灏天文库整理
由灏天文库结构化整理,提供目录导航、全文检索与在线阅读,便于系统化学习
发布者: 作者: microsoft 转发
评论区 (0)
U