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()переработаны).Объектные API —
find_blobs(),get_histogram(),get_statistics()теперь возвращают объекты с именованными методами доступа.QR-коды — добавлено обнаружение
image.find_qrcodes().OpenMV Cam M7 — начальная поддержка платы.
Sensor —
set_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и оценкой поворота; сохранение/загрузка ключевых точек.Объектные API —
image.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 с изменёнными значениями по умолчанию.
Переименование автоматических функций датчика (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()) и т. д.).
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 или размер кадра.
Масштабирование lens_corr() теперь работает (behavior)¶
image.lens_corr() теперь действительно применяет свой аргумент zoom (ранее он разбирался, но не действовал), поэтому вывод отличается для скриптов, передававших нестандартное масштабирование. Перепроверьте настройку lens_corr().
Коммиты: d6b49adef
Контрольный список миграции¶
Для чистого перехода на v2.1.0 обычно нужно:
Заменить
image.FREAKнаimage.ORB, убрать аргумент типа дескриптора и обновить распаковку кортежаmatch_descriptor()/draw_keypoints()на объект ключевых точек (переработка ORB).Переименовать
sensor.set_whitebal()/set_gain_ctrl()/set_exposure_ctrl()в формыset_auto_*(переименование автоматических функций).Перенести код гистограммы/статистики на объектные методы (переработка гистограммы/статистики).
Переименовать
scale=вfind_features()вscale_factor=(переименование find_features).Использовать методы доступа объекта блоба и заменить
find_markers()наfind_blobs(merge=True, ...)(изменение find_blobs); заменитьimg.copy_to_fb()именованным аргументомcopy_to_fb=(изменение copy_to_fb).Ограничить качество
compress()диапазоном 1–100 и перепроверить размеры JPEG на OpenMV 3 (изменение compress); перенастроить масштабированиеlens_corr()(изменение lens_corr).
Все остальные скрипты работают без изменений.