|
|
<!--
|
|
|
CO_OP_TRANSLATOR_METADATA:
|
|
|
{
|
|
|
"original_hash": "3ba7150ffc4a6999f6c3cfb4906ec7df",
|
|
|
"translation_date": "2025-08-28T16:07:06+00:00",
|
|
|
"source_file": "4-manufacturing/lessons/2-check-fruit-from-device/virtual-device-camera.md",
|
|
|
"language_code": "uk"
|
|
|
}
|
|
|
-->
|
|
|
# Захоплення зображення - Віртуальне IoT обладнання
|
|
|
|
|
|
У цій частині уроку ви додасте сенсор камери до вашого віртуального IoT пристрою та зчитуватимете зображення з нього.
|
|
|
|
|
|
## Обладнання
|
|
|
|
|
|
Віртуальний IoT пристрій використовуватиме симульовану камеру, яка надсилатиме зображення або з файлів, або з вашої вебкамери.
|
|
|
|
|
|
### Додайте камеру до CounterFit
|
|
|
|
|
|
Щоб використовувати віртуальну камеру, потрібно додати її до додатку CounterFit.
|
|
|
|
|
|
#### Завдання - додати камеру до CounterFit
|
|
|
|
|
|
Додайте камеру до додатку CounterFit.
|
|
|
|
|
|
1. Створіть новий Python-додаток на вашому комп'ютері у папці `fruit-quality-detector` з одним файлом `app.py` та віртуальним середовищем Python, і додайте пакети CounterFit через pip.
|
|
|
|
|
|
> ⚠️ Ви можете звернутися до [інструкцій зі створення та налаштування Python-проєкту CounterFit у уроці 1, якщо це необхідно](../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.md).
|
|
|
|
|
|
1. Встановіть додатковий пакет через pip для встановлення CounterFit shim, який може взаємодіяти з сенсорами камери, симулюючи деякі функції [Picamera Pip package](https://pypi.org/project/picamera/). Переконайтеся, що ви встановлюєте це з терміналу, де активоване віртуальне середовище.
|
|
|
|
|
|
```sh
|
|
|
pip install counterfit-shims-picamera
|
|
|
```
|
|
|
|
|
|
1. Переконайтеся, що веб-додаток CounterFit запущений.
|
|
|
|
|
|
1. Створіть камеру:
|
|
|
|
|
|
1. У вікні *Create sensor* на панелі *Sensors* розгорніть поле *Sensor type* і виберіть *Camera*.
|
|
|
|
|
|
1. Встановіть *Name* як `Picamera`.
|
|
|
|
|
|
1. Натисніть кнопку **Add**, щоб створити камеру.
|
|
|
|
|
|

|
|
|
|
|
|
Камера буде створена і з'явиться у списку сенсорів.
|
|
|
|
|
|

|
|
|
|
|
|
## Програмування камери
|
|
|
|
|
|
Тепер віртуальний IoT пристрій можна запрограмувати для використання віртуальної камери.
|
|
|
|
|
|
### Завдання - програмування камери
|
|
|
|
|
|
Програмуйте пристрій.
|
|
|
|
|
|
1. Переконайтеся, що додаток `fruit-quality-detector` відкритий у VS Code.
|
|
|
|
|
|
1. Відкрийте файл `app.py`.
|
|
|
|
|
|
1. Додайте наступний код на початок `app.py`, щоб підключити додаток до CounterFit:
|
|
|
|
|
|
```python
|
|
|
from counterfit_connection import CounterFitConnection
|
|
|
CounterFitConnection.init('127.0.0.1', 5000)
|
|
|
```
|
|
|
|
|
|
1. Додайте наступний код до вашого файлу `app.py`:
|
|
|
|
|
|
```python
|
|
|
import io
|
|
|
from counterfit_shims_picamera import PiCamera
|
|
|
```
|
|
|
|
|
|
Цей код імпортує необхідні бібліотеки, включаючи клас `PiCamera` з бібліотеки counterfit_shims_picamera.
|
|
|
|
|
|
1. Додайте наступний код нижче, щоб ініціалізувати камеру:
|
|
|
|
|
|
```python
|
|
|
camera = PiCamera()
|
|
|
camera.resolution = (640, 480)
|
|
|
camera.rotation = 0
|
|
|
```
|
|
|
|
|
|
Цей код створює об'єкт PiCamera, встановлює роздільну здатність 640x480. Хоча підтримуються вищі роздільні здатності, класифікатор зображень працює з набагато меншими зображеннями (227x227), тому немає потреби захоплювати та надсилати більші зображення.
|
|
|
|
|
|
Рядок `camera.rotation = 0` встановлює обертання зображення в градусах. Якщо потрібно повернути зображення з вебкамери або файлу, налаштуйте це відповідно. Наприклад, якщо ви хочете змінити зображення банана на вебкамері в ландшафтному режимі на портретний, встановіть `camera.rotation = 90`.
|
|
|
|
|
|
1. Додайте наступний код нижче, щоб захопити зображення у вигляді бінарних даних:
|
|
|
|
|
|
```python
|
|
|
image = io.BytesIO()
|
|
|
camera.capture(image, 'jpeg')
|
|
|
image.seek(0)
|
|
|
```
|
|
|
|
|
|
Цей код створює об'єкт `BytesIO` для зберігання бінарних даних. Зображення зчитується з камери як файл JPEG і зберігається в цьому об'єкті. Цей об'єкт має індикатор позиції, щоб знати, де він знаходиться в даних, тому рядок `image.seek(0)` переміщує цю позицію назад на початок, щоб усі дані могли бути зчитані пізніше.
|
|
|
|
|
|
1. Нижче цього додайте наступний код для збереження зображення у файл:
|
|
|
|
|
|
```python
|
|
|
with open('image.jpg', 'wb') as image_file:
|
|
|
image_file.write(image.read())
|
|
|
```
|
|
|
|
|
|
Цей код відкриває файл під назвою `image.jpg` для запису, потім зчитує всі дані з об'єкта `BytesIO` і записує їх у файл.
|
|
|
|
|
|
> 💁 Ви можете захопити зображення безпосередньо у файл, а не в об'єкт `BytesIO`, передавши ім'я файлу у виклик `camera.capture`. Причина використання об'єкта `BytesIO` полягає в тому, що пізніше у цьому уроці ви зможете надіслати зображення до вашого класифікатора зображень.
|
|
|
|
|
|
1. Налаштуйте зображення, яке камера в CounterFit буде захоплювати. Ви можете встановити *Source* як *File*, потім завантажити файл зображення, або встановити *Source* як *WebCam*, і зображення будуть захоплюватися з вашої вебкамери. Переконайтеся, що ви натиснули кнопку **Set** після вибору зображення або вебкамери.
|
|
|
|
|
|

|
|
|
|
|
|
1. Зображення буде захоплено і збережено як `image.jpg` у поточній папці. Ви побачите цей файл у провіднику VS Code. Виберіть файл, щоб переглянути зображення. Якщо воно потребує обертання, оновіть рядок `camera.rotation = 0` відповідно і зробіть ще одну фотографію.
|
|
|
|
|
|
> 💁 Ви можете знайти цей код у папці [code-camera/virtual-iot-device](../../../../../4-manufacturing/lessons/2-check-fruit-from-device/code-camera/virtual-iot-device).
|
|
|
|
|
|
😀 Ваша програма для камери була успішною!
|
|
|
|
|
|
---
|
|
|
|
|
|
**Відмова від відповідальності**:
|
|
|
Цей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, майте на увазі, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критичної інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу. |