v2.4.0

В v2.4.0 find_lines() переписан как детектор на основе преобразования Хафа, добавлены find_line_segments(), декодирование data-matrix find_datamatrices(), sensor.set_vsync_output(), чтение/запись срезов изображения и множество новых масштабированных размеров кадра для более высокого FPS. find_lines(), match_descriptor() и skip_frames() изменились — прочтите о несовместимых изменениях ниже.

Основное

  • find_lines() — переписан как детектор линий на основе преобразования Хафа, возвращающий объекты линий (теперь работает с RGB565, а не только с оттенками серого).

  • find_line_segments() — обнаружение конечных отрезков линий.

  • find_datamatrices() — декодирование data-matrix.

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

  • Больше размеров кадра — множество дополнительных масштабированных разрешений для более высокого FPS.

  • Несовместимо: find_lines(), match_descriptor() и skip_frames() изменились — см. несовместимые изменения.

Новые возможности

  • image.find_line_segments() — поиск конечных отрезков линий; объекты линий получили аксессор .length().

  • image.find_datamatrices() — декодирование data-matrix, с примерами скриптов.

  • 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 (а также вышестоящие исправления индексации битовой карты ячеек quirc и границ шаблона выравнивания).

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

  • Понижена тактовая частота датчика 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.

Коммиты: 31b7b5bf3, f4a9c6154

match_descriptor() возвращает объект совпадения (minor)

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

Коммиты: e960546b6

sensor.skip_frames() теперь основан на времени (behavior)

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

Коммиты: a039b5d1c

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

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

  1. Адаптируйте распаковку кортежей find_lines() к объектам линий и перенастройте целочисленный threshold (переписывание find_lines).

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

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

Все остальные скрипты работают без изменений.