v2.1.0

v2.1.0 — это масштабный релиз модернизации API. Он заменяет дескриптор ключевых точек FREAK на ORB, перерабатывает find_blobs() / гистограммы / статистику в объектно-ориентированные API, переименовывает функции автоматической экспозиции/усиления/баланса белого sensor, добавляет обнаружение QR-кодов и коррекцию объектива OV7725, а также вводит начальную поддержку платы OpenMV Cam M7. Многие API изменились — прочитайте о критических изменениях ниже.

Основные новшества

  • Ключевые точки ORB — дескриптор FREAK заменён на ORB (find_keypoints() / match_descriptor() переработаны).

  • Объектные APIfind_blobs(), get_histogram(), get_statistics() теперь возвращают объекты с именованными методами доступа.

  • QR-коды — добавлено обнаружение image.find_qrcodes().

  • OpenMV Cam M7 — начальная поддержка платы.

  • Sensorset_auto_whitebal() / set_auto_gain() / set_auto_exposure() (переименованы) и set_lens_correction().

  • Критическое: изменились API ключевых точек/дескрипторов, блобов/гистограмм/статистики, автоматических функций датчика и ряд других — см. критические изменения.

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

  • OpenMV Cam M7 — добавлена начальная поддержка платы OpenMV 3 (M7).

  • QR-коды — добавлен image.find_qrcodes() с примером qrcodes.py.

  • Ключевые точки ORB — новая система дескрипторов ORB: find_keypoints() с аргументом corner_detector (CORNER_FAST / CORNER_AGAST), max_keypoints / scale_factor; match_descriptor() с именованным аргументом filter_outliers и оценкой поворота; сохранение/загрузка ключевых точек.

  • Объектные APIimage.get_histogram() / get_statistics() / get_percentile() возвращают объекты гистограммы/статистики; find_blobs() возвращает объекты блобов (rect() / cx() / cy() / code() / area() / pixels()) с area_threshold / pixels_threshold / merge / margin / invert и x_stride / y_stride.

  • Sensor — добавлен sensor.set_lens_correction(enable, radi, coef) для коррекции виньетирования объектива OV7725, sensor.set_windowing() теперь также принимает кортеж (w, h) (автоматически центрируется), а также image.Image(..., copy_to_fb=True) / load_image(copy_to_fb=True).

  • Добавлены примеры скриптов для отслеживания цвета, режима Arduino SPI/I2C-slave, ключевых точек и гистограммы/статистики.

Прочие изменения и улучшения

  • IDE теперь может прерывать выполняющийся main.py; ускорены find_blobs() / find_qrcodes() / get_statistics(); ORB использует расстояние Хэмминга на основе popcount; коррекция объектива использует меньше RAM; правило udev для Linux не даёт ModemManager захватывать последовательный порт.

Исправления ошибок

Камера и обработка изображений:

  • Исправлены очистка/инвалидация кэша DMA на M7 (повреждённые кадры), лишняя строка в конце каждого кадра, границы переполнения буфера кадра JPEG, освобождение буфера кадра при сбое compress(), точность ORB / ROI / обработка пустого набора, а также геометрия load_image(copy_to_fb=True).

Система:

  • Исправлены поддержка ADC на F7, имя регистра OV7725, тайминги загрузчика/USB, используется WFI во время ожидания снимков, а пример потокового MJPEG сделан неблокирующим с таймаутами для каждого клиента.

Поддержка оборудования и плат

  • OpenMV Cam M7 (OpenMV 3) — начальная поддержка платы.

  • OV7725 — поддержка коррекции объектива (виньетирования).

Критические изменения API

Видимые пользователю изменения API между v2.0.0 и v2.1.0. Область: C-модули Python в modules/ и библиотеки Python в scripts/libraries/.

Каждое изменение помечено по степени воздействия:

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

  • minor — узкий API; затрагивает только скрипты, которые его использовали.

  • behavior — тот же API, другой результат; перепроверьте настроенные скрипты.

Изменения сгруппированы по воздействию в этом порядке. Если вам нужно просто портировать код, перейдите к контрольному списку миграции в конце. Каждый хеш коммита ссылается на его diff на GitHub.

FREAK заменён на ORB; API дескрипторов переработан (major)

Дескриптор ключевых точек FREAK был удалён и заменён на ORB: image.FREAK больше не существует (используйте image.ORB). image.match_descriptor() / save_descriptor() / load_descriptor() больше не принимают ведущий аргумент типа дескриптора (он выводится из объекта), match_descriptor() теперь возвращает кортеж из 8 элементов (cx, cy, x, y, w, h, match_count, rotation) (последний элемент — необработанное количество, а не процент), а draw_keypoints() требует объект ключевых точек вместо необработанного списка (x, y, angle). find_keypoints() получил corner_detector / max_keypoints / scale_factor с изменёнными значениями по умолчанию.

Коммиты: e2d0c4840, bba8e5a9e, 6000684cb

Переименование автоматических функций датчика (major)

sensor.set_whitebal() / set_gain_ctrl() / set_exposure_ctrl() были переименованы в sensor.set_auto_whitebal() / set_auto_gain() / set_auto_exposure() (старые имена удалены). Каждая получила необязательный именованный аргумент value= для установки ручного значения вместо автоматического.

Коммиты: 1b22a2961

Гистограмма / статистика переработаны в объектные API (major)

Интерфейс гистограммы/статистики переработан в объектно-ориентированные image.get_histogram() / get_statistics() / get_percentile(), возвращающие объекты гистограммы/статистики. Старые плоские результаты гистограммы/статистики и методы bin_count / l_bin_count / a_bin_count / b_bin_count были удалены (используйте len(histogram.bins()) и т. д.).

Коммиты: 011108412, 9f37c83de

scale в find_features() переименован (major)

image.find_features() (Haar) переименовал свой именованный аргумент scale= в scale_factor=. Обновите вызовы find_features(cascade, scale=...) на scale_factor=....

Коммиты: 96e4f770c

find_blobs() возвращает объекты; find_markers() удалён (minor)

image.find_blobs() теперь возвращает объекты блобов с именованными методами доступа (доступ по индексу по-прежнему работает для обратной совместимости), а image.find_markers() был удалён — вместо него используйте find_blobs(..., merge=True, margin=...). Расширенная функция обратного вызова для фильтрации цветовых блобов больше не поддерживается.

Коммиты: af15ec6eb

img.copy_to_fb() заменён (minor)

Метод img.copy_to_fb() заменён именованным аргументом copy_to_fb= у image.Image / load_image(). Используйте image.Image(path, copy_to_fb=True), чтобы загружать большие изображения прямо в буфер кадра.

Коммиты: 1645ab94b

compress() отклоняет качество вне диапазона (behavior)

image.compress() / compressed() теперь вызывают ошибку, когда quality выходит за пределы 1–100, вместо тихого ограничения. Ограничьте quality диапазоном 1–100 перед вызовом. Кроме того, буфер JPEG на OpenMV 3 был уменьшен с 64 КБ до 23000 байт, поэтому большие кадры теперь могут вызывать ошибку нехватки памяти — снизьте качество JPEG или размер кадра.

Коммиты: 9efd7474a, 9a7c3defc

Масштабирование lens_corr() теперь работает (behavior)

image.lens_corr() теперь действительно применяет свой аргумент zoom (ранее он разбирался, но не действовал), поэтому вывод отличается для скриптов, передававших нестандартное масштабирование. Перепроверьте настройку lens_corr().

Коммиты: d6b49adef

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

Для чистого перехода на v2.1.0 обычно нужно:

  1. Заменить image.FREAK на image.ORB, убрать аргумент типа дескриптора и обновить распаковку кортежа match_descriptor() / draw_keypoints() на объект ключевых точек (переработка ORB).

  2. Переименовать sensor.set_whitebal() / set_gain_ctrl() / set_exposure_ctrl() в формы set_auto_* (переименование автоматических функций).

  3. Перенести код гистограммы/статистики на объектные методы (переработка гистограммы/статистики).

  4. Переименовать scale= в find_features() в scale_factor= (переименование find_features).

  5. Использовать методы доступа объекта блоба и заменить find_markers() на find_blobs(merge=True, ...) (изменение find_blobs); заменить img.copy_to_fb() именованным аргументом copy_to_fb= (изменение copy_to_fb).

  6. Ограничить качество compress() диапазоном 1–100 и перепроверить размеры JPEG на OpenMV 3 (изменение compress); перенастроить масштабирование lens_corr() (изменение lens_corr).

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