v1.2.0

v1.2.0 — это основополагающий, очень крупный выпуск, который формирует большую часть классического API обработки изображений OpenMV: методы рисования, операции бинаризации / морфологии, дескрипторы ключевых точек (FAST / FREAK / LBP), преобразования цвета и image.statistics, файловый ввод-вывод BMP / PPM / JPEG, модули lcd, mjpeg, gif и тепловой mlx, камеру OV7725 и множество элементов управления sensor. Некоторое базовое поведение sensor изменилось — ознакомьтесь с критическими изменениями ниже.

Основные моменты

  • API рисованияdraw_line() / draw_rectangle() / draw_circle() / draw_string() / draw_cross() / draw_keypoints().

  • Бинаризация / морфологияbinary(), invert(), and/or/xor/..., erode() / dilate() / morph(), negate() / difference().

  • Ключевые точки — дескрипторы FAST / FREAK / LBP с match_descriptor() / save_descriptor() / load_descriptor().

  • Новые модулиlcd, mjpeg, gif (цветной) и тепловой mlx.

  • Поддержка камеры OV7725; image.statistics; файловый ввод-вывод BMP/PPM/JPEG.

  • Критическое: поведение sensor.reset(), sensor.snapshot() и sensor.set_pixformat() изменилось — см. критические изменения.

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

  • Рисование — добавлены image.draw_line() / draw_rectangle() / draw_circle() / draw_string() / draw_cross() / draw_keypoints() с именованными аргументами (цвет, толщина, …).

  • Бинаризация / морфология — добавлены image.binary(), invert(), and() / nand() / or() / nor() / xor() / xnor(), erode() / dilate() / morph(), negate() / difference(), pixels(), centroid(), orientation_radians() / orientation_degrees() и width() / height() / format().

  • Ключевые точки / дескрипторы — извлечение ключевых точек FAST через find_keypoints(), унифицированные match_descriptor() и save_descriptor() / load_descriptor() для FREAK / LBP, а также каскад Haar/LBP для профиля лица.

  • Цвет / статистикаimage.statistics и функции преобразования цвета (rgb_to_lab / lab_to_rgb / rgb_to_grayscale / grayscale_to_rgb).

  • Файловый ввод-вывод — загрузка и сохранение BMP / PPM (P2/P3/P5/P6) / JPEG (включая JPEG в оттенках серого и субдискретизацию цветности 4:2:0 / 4:2:2).

  • Модули — новые модули lcd (LCD-шилд), mjpeg (запись видео), цветной gifGif.loop()) и тепловой mlx, каждый с примерами скриптов.

  • Датчик — добавлены sensor.get_id() (+ константы PID для OV9650/OV2640/OV7725), sensor.set_special_effect() (константы SDE_*), sensor.set_image_filter() (FILTER_BW / FILTER_SKIN), размер кадра HQVGA и image.set_pixel(x, y, …).

  • WiFi — добавлены драйвер WiFi ATWINC1500 и основа BSP для OpenMV 1/2, а также пример BLE.

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

  • Буфер кадра теперь сжимается в JPEG перед потоковой передачей в OpenMV IDE (меньше полосы пропускания); сжатие JPEG выполняется на месте; масштабирование по H/V для OV7725 обеспечивает произвольное масштабирование; улучшено (ускорено) обнаружение лиц по Haar, работающее на QVGA.

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

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

  • Исправлены вычисление интегрального изображения, повреждение фильтром median(), вычисление центроида, фильтры RGB skin / черно-белый на RGB-входе, а также ускорены чтение/запись BMP/PPM в оттенках серого.

Датчик и система:

  • Исправлены таймеры pyb.Servo (Servo теперь работает), разрешение HQVGA, надежность инициализации SD-карты, повторная инициализация хранилища после программной перезагрузки и повторный запуск REPL при отсутствии скрипта.

Аппаратное обеспечение и поддержка плат

  • Датчик камеры OV7725.

  • LCD-шилд (модуль lcd), тепловая камера mlx и основа WiFi ATWINC1500.

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

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

Все три критических изменения — это изменения поведения основных функций sensor (тот же API, другое поведение) — перепроверьте затронутые скрипты. Каждый хеш коммита ведет на его diff на GitHub. (Подавляющее большинство этого выпуска — новый API, построенный в диапазоне v1.1→v1.2, и поэтому он дополняющий, а не критический.)

sensor.reset() больше не применяет конфигурацию по умолчанию (поведение)

sensor.reset() больше не применяет встроенную конфигурацию по умолчанию (pixformat / framesize / framerate / усиление / контрастность / яркость / насыщенность). Скрипты, которые полагались на то, что reset() оставляет пригодные для использования значения по умолчанию, теперь должны явно вызывать sensor.set_pixformat() и sensor.set_framesize() (и любые другие настройки) после reset().

Коммиты: d1e782df3

sensor.snapshot() вызывает исключение при тайм-ауте (поведение)

sensor.snapshot() теперь вызывает RuntimeError("Sensor Timeout!!"), когда датчик превышает тайм-аут, вместо бесконечного зависания. Оберните snapshot() в try / except RuntimeError, если вам нужно допускать тайм-ауты.

Коммиты: e3f41d674

sensor.set_pixformat() вызывает исключение при неподдерживаемом формате (поведение)

sensor.set_pixformat() теперь вызывает исключение при передаче неподдерживаемого формата пикселей вместо возврата False. Код, проверявший возврат False, должен вместо этого перехватывать исключение.

Коммиты: e0c5822c2

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

Для чистого переноса на v1.2.0 типичная работа такова:

  1. Явно установите sensor.set_pixformat() / sensor.set_framesize() после sensor.reset() (изменение reset).

  2. Оберните sensor.snapshot() в try / except RuntimeError, если вам нужно допускать тайм-ауты датчика (изменение snapshot).

  3. Перехватывайте исключение из sensor.set_pixformat() вместо проверки на False (изменение set_pixformat).

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