v2.4.0

v2.4.0 переписує find_lines() як детектор на основі перетворення Хафа, додає find_line_segments(), декодування матриць даних find_datamatrices(), sensor.set_vsync_output(), читання/запис зрізів зображення та багато нових масштабованих розмірів кадрів для вищої частоти кадрів. find_lines(), match_descriptor() та skip_frames() змінилися — прочитайте розділ про несумісні зміни нижче.

Основне

  • find_lines() — переписано як детектор ліній на основі перетворення Хафа, що повертає об’єкти ліній (тепер працює з RGB565, а не лише з відтінками сірого).

  • find_line_segments() — виявлення кінцевих відрізків.

  • find_datamatrices() — декодування матриць даних.

  • sensor.set_vsync_output() — вивід VSYNC на вивід введення/виведення для синхронізації камери.

  • Більше розмірів кадрів — багато додаткових масштабованих роздільних здатностей для вищої частоти кадрів.

  • Несумісні зміни: find_lines(), match_descriptor() та skip_frames() змінилися — дивіться розділ про несумісні зміни.

Нові функції

  • image.find_line_segments() — знаходження кінцевих відрізків; об’єкти ліній отримали аксесор .length().

  • image.find_datamatrices() — декодування матриць даних з прикладами скриптів.

  • sensor.set_vsync_output(pin) — виведення сигналу VSYNC на вивід GPIO для синхронізації камери (OpenMV 2 / OpenMV 3).

  • Зрізи зображення — підписки до зображення / протокол буфера тепер підтримує читання та запис зрізів даних зображення.

  • Додано багато додаткових комбінацій масштабованих роздільних здатностей / розмірів кадрів для підтримки вищої частоти кадрів; clock.fps() тепер скидає акумулятори кожні 2 с, щоб відображена FPS відповідала останній частоті.

Інші зміни та покращення

  • OV7725 вікується до QVGA при роздільній здатності ≤ VGA (менше пропущених кадрів при високій частоті захоплення), а його PLL встановлено на 6× зі зменшеним зовнішнім тактовим сигналом (OpenMV 2 48 МГц, OpenMV 3 54 МГц), що змінює часові характеристики датчика.

Виправлення помилок

Зображення:

  • Виправлено помилку розміру буфера compress_for_ide() (маркери початку/кінця), декодування QR (а також виправлення від upstream quirc: індексування bitmap комірок та межі шаблону вирівнювання).

Датчик і підключення:

  • Знижено тактовий сигнал датчика OpenMV 2 для роботи з вищим PLL датчика (ініціалізація/синхронізація камери), а socket.recvfrom() WINC тепер повертає фактичний отриманий розмір (викидаючи помилку при від’ємному або нульовому розмірі замість повернення застарілого значення).

Апаратне забезпечення та підтримка плат

  • Вивід VSYNC на вивід GPIO (OpenMV 2 / OpenMV 3) для sensor.set_vsync_output().

  • OpenMV 3 — увімкнено pyb.UART UART1.

Несумісні зміни API

Видимі для користувача зміни API між v2.3.0 та v2.4.0. Область: Python C-модулі в modules/ та бібліотеки Python у scripts/libraries/.

Кожна зміна позначена за ступенем впливу:

  • major — стосується більшості скриптів, що використовували цю функцію; знадобиться перенесення коду.

  • minor — вузький API; стосується лише скриптів, що його використовували.

  • behavior — той самий API, інші результати; перевірте налаштовані скрипти.

Зміни згруповані за ступенем впливу у такому порядку. Якщо вам потрібно лише перенести код, перейдіть до контрольного списку міграції наприкінці. Кожен хеш коміту є посиланням на diff на GitHub.

find_lines() переписано як детектор Хафа (major)

image.find_lines() було переписано як детектор на основі перетворення Хафа. Він більше не повертає список кортежів (x1, y1, x2, y2) — він повертає об’єкти ліній (.line() / .x1() / .y1() / .x2() / .y2() / .theta() / .rho() / .magnitude()) — і тепер також працює з RGB565 (а не лише з відтінками сірого). Аргумент threshold змінився з числа з плаваючою комою 0.0–1.0 на цілочисельну суму магнітуд меж, line.magnitude тепер є цілим числом, а нові ключові слова theta_margin / rho_margin були додані. Перенесіть код розпакування кортежів на об’єкти ліній та перевірте threshold.

Commits: 31b7b5bf3, f4a9c6154

match_descriptor() повертає об’єкт відповідності (minor)

image.match_descriptor() (ORB) тепер повертає об’єкт kptmatch з аксесорами .cx() / .cy() / .x() / .y() / .w() / .h() / .count() / .theta() / .rect() замість простого 8-кортежу. Об’єкт досі підтримує підписки/зрізи, тому позиційна індексація продовжує працювати, але код, що використовував isinstance(result, tuple) (або методи кортежу), повинен перейти на нові аксесори.

Commits: e960546b6

sensor.skip_frames() тепер базується на часі (behavior)

sensor.skip_frames() було перероблено для прийому ключового слова time= (за замовчуванням ~300 мс) і тепер за замовчуванням базується на часі, а не виконує фіксовану кількість кадрів, зупиняючись достроково після закінчення часу. Скрипти, що покладалися на точну кількість кадрів, повинні передати явний лічильник та/або відповідно встановити time=.

Commits: a039b5d1c

Контрольний список міграції

Для коректного перенесення на v2.4.0 типовий обсяг роботи такий:

  1. Перенесіть розпакування кортежів find_lines() на об’єкти ліній та перевірте цілочисельний threshold (переписування find_lines).

  2. Використовуйте аксесори kptmatch замість обробки результатів match_descriptor() як кортежу (зміна match_descriptor).

  3. Передайте явний лічильник та/або time= у sensor.skip_frames(), якщо ви покладалися на фіксовану кількість кадрів (зміна skip_frames).

Усі інші скрипти працюють без змін.