|
|
<!--
|
|
|
CO_OP_TRANSLATOR_METADATA:
|
|
|
{
|
|
|
"original_hash": "3ba7150ffc4a6999f6c3cfb4906ec7df",
|
|
|
"translation_date": "2025-08-28T12:27:12+00:00",
|
|
|
"source_file": "4-manufacturing/lessons/2-check-fruit-from-device/virtual-device-camera.md",
|
|
|
"language_code": "sr"
|
|
|
}
|
|
|
-->
|
|
|
# Снимање слике - Виртуелни IoT хардвер
|
|
|
|
|
|
У овом делу лекције, додаћете сензор камере вашем виртуелном IoT уређају и читати слике са њега.
|
|
|
|
|
|
## Хардвер
|
|
|
|
|
|
Виртуелни IoT уређај ће користити симулирану камеру која шаље слике или из датотека, или са ваше веб камере.
|
|
|
|
|
|
### Додавање камере у CounterFit
|
|
|
|
|
|
Да бисте користили виртуелну камеру, потребно је да је додате у CounterFit апликацију.
|
|
|
|
|
|
#### Задатак - додавање камере у CounterFit
|
|
|
|
|
|
Додајте камеру у CounterFit апликацију.
|
|
|
|
|
|
1. Направите нову Python апликацију на вашем рачунару у фасцикли под називом `fruit-quality-detector` са једним фајлом под називом `app.py` и Python виртуелним окружењем, и додајте CounterFit pip пакете.
|
|
|
|
|
|
> ⚠️ Можете се позвати на [упутства за креирање и подешавање CounterFit Python пројекта у лекцији 1 ако је потребно](../../../1-getting-started/lessons/1-introduction-to-iot/virtual-device.md).
|
|
|
|
|
|
1. Инсталирајте додатни Pip пакет за инсталацију CounterFit shim-а који може комуницирати са сензорима камере симулирајући неке од функција [Picamera Pip пакета](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). Иако се трудимо да превод буде тачан, молимо вас да имате у виду да аутоматизовани преводи могу садржати грешке или нетачности. Оригинални документ на његовом изворном језику треба сматрати ауторитативним извором. За критичне информације препоручује се професионални превод од стране људи. Не преузимамо одговорност за било каква погрешна тумачења или неспоразуме који могу настати услед коришћења овог превода. |