клас ImageIO – об’єкт ImageIO

Клас ImageIO записує та відтворює потоки кадрів Image у власному форматі OpenMV на диску. Один потік може містити різнорідні кадри (різні формати пікселів / розміри) і зберігає міжкадровий інтервал для кожного кадру, щоб відтворення відповідало оригінальній частоті кадрів.

Існує два типи сховища:

  • Файловий потік – кадри зчитуються з / додаються до файлу в файловій системі. Файл починається з 16-байтного магічного заголовка OMV IMG STR Vx.y, після якого йдуть блоки даних для кожного кадру. Поточний модуль запису використовує V2.0; старіші файли V1.0 та V1.1 залишаються читабельними.

  • Потік у пам’яті – кадри зчитуються з / записуються до буфера RAM фіксованого розміру, виділеного під час створення об’єкта. Корисно для обробки кадрів через фільтри, яким потрібен запис без звертання до файлової системи.

class image.ImageIO(path: str | Tuple[int, int, int], mode: str | int)

Створення об’єкта ImageIO.

Якщо path є рядком, файловий потік відкривається за вказаним шляхом. mode має бути одним з:

  • 'r' – відкрити наявний файл для читання. Магічний заголовок перевіряється, а версія (V1.0 / V1.1 / V2.0) зберігається для використання методом version().

  • 'w' – скоротити / створити файл і записати новий магічний заголовок V2.0. Кадри додаються при кожному виклику write().

Якщо path є 3-кортежем (w, h, pixformat), виділяється потік у пам’яті. mode тоді є цілим числом – кількістю слотів для кадрів, що попередньо виділяються. Буфер розраховується на count кадрів формату (w, h, pixformat) і не може розширюватися після створення. pixformat – одне з image.BINARY, image.GRAYSCALE, image.RGB565, image.BAYER, image.YUV422, image.JPEG або image.PNG. Для стиснутих форматів (image.JPEG, image.PNG) розмір слота оцінюється як 2 байти/піксель; кадри, більші за оцінку, викликають ValueError під час виконання write().

Огляд

type() int

Повертає тип сховища потоку: FILE_STREAM для файлового потоку або MEMORY_STREAM для потоку в пам’яті.

is_closed() bool

Повертає True, якщо для цього об’єкта було викликано close(). Після закриття потік генерує OSError("Stream closed") при будь-якій подальшій операції читання/запису/переміщення.

count() int

Повертає кількість кадрів, що зберігаються в потоці на даний момент. Для файлових потоків це значення зростає при кожному додаванні кадру через write(); для потоків у пам’яті воно фіксується під час створення.

offset() int

Повертає поточний індекс кадру. Збільшується методами read() та write(), скидається методом seek().

version() int | None

Повертає версію формату файлу для файлових потоків (10 для V1.0, 11 для V1.1, 20 для V2.0). Повертає None для потоків у пам’яті.

buffer_size() int | None

Повертає розмір буфера пікселів одного слота в байтах для потоків у пам’яті (розмір слота мінус внутрішній заголовок службових даних Image). Повертає None для файлових потоків. Використовуйте це разом із count(), щоб перевірити, чи поміститься кадр певного розміру.

size() int

Повертає загальну кількість байтів, що займає потік – розмір файлу на диску для файлових потоків або повний розмір буфера RAM (count * per_slot_size, включаючи заголовок кожного слота) для потоків у пам’яті.

Введення/виведення

write(img: Image) ImageIO

Додає (файловий потік) або записує за зміщенням (потік у пам’яті) зображення img та збільшує offset() на одиницю.

Для файлових потоків файл розростається при додаванні кадрів. Запис за зміщенням, відмінним від кінця файлу, обрізає решту файлу, тому кількість кадрів може зменшуватися.

Для потоків у пам’яті кадр записується в поточний слот; запис за межами останнього слота викликає EOFError("End of stream"), а запис кадру, більшого за buffer_size(), викликає ValueError("Invalid frame size").

Повертає self, що дозволяє об’єднувати виклики в ланцюжок.

read(copy_to_fb: bool = True, *, loop: bool = True, pause: bool = True) Image | None

Зчитує кадр за поточним offset(), збільшує зміщення та повертає новий об’єкт Image. Це зворотна операція до write().

copy_to_fb – якщо True (за замовчуванням), декодований кадр розміщується в кадровому буфері камери (те саме місце, куди потрапляє результат csi.CSI.snapshot()), тож повернений Image можна відображати в попередньому перегляді IDE. Якщо False, кадр виділяється в купі MicroPython.

loop (тільки для файлових потоків) – якщо True (за замовчуванням), після читання останнього кадру відбувається повернення на початок і продовження відтворення. Якщо False, виклик повертає None після досягнення кінця файлу.

pause – якщо True (за замовчуванням), виклик блокує виконання до закінчення оригінально записаного міжкадрового інтервалу, щоб відтворення відповідало оригінальній частоті кадрів. Встановіть False для максимально швидкого відтворення.

seek(offset: int) ImageIO

Переміщує offset() до кадру offset. offset має бути невід’ємним; для потоків у пам’яті значення також має бути меншим за count().

Переміщення по файловому потоку відбувається покадрово з початку файлу, оскільки розміри блоків кадрів є змінними – очікуйте часу O(offset) для великих стрибків.

Повертає self, що дозволяє об’єднувати виклики в ланцюжок.

sync() ImageIO

Скидає очікуючі записи на диск для файлових потоків (викликає sync файлової системи). Для потоків у пам’яті є операцією без дій.

Повертає self, що дозволяє об’єднувати виклики в ланцюжок.

close() None

Закриває потік. Звільняє буфер пам’яті (потоки в пам’яті) або закриває файл (файлові потоки). Після виклику close() об’єкт ImageIO не може бути повторно використаний; подальші операції викликають OSError("Stream closed"). Повторний виклик close() є операцією без дій.

Об’єкт ImageIO також закривається автоматично при збиранні сміттям (він реєструє фіналізатор під час створення).

Константи

FILE_STREAM: int

Значення, що повертається type() для потоків, підкріплених файлом.

MEMORY_STREAM: int

Значення, що повертається type() для потоків у пам’яті.