image — машинное зрение¶
Модуль image – это сердце стека машинного зрения OpenMV. Он предоставляет класс Image – находящийся в памяти буфер пикселей, с которым работают все процедуры рисования, фильтрации, преобразования и извлечения признаков, – вместе со вспомогательными объектами результатов, возвращаемыми этими процедурами (Blob, Line, Circle, Rect, QRCode, AprilTag, DataMatrix, BarCode, …), и вспомогательными классами, используемыми для их настройки (Threshold, Histogram, Statistics, HaarCascade, Similarity, Percentile, Displacement, ImageIO).
Получение изображения¶
Существует четыре способа поместить Image в оперативную память:
Живой захват с датчика камеры. Вызовите
csi.CSI.snapshot(), чтобы захватить следующий кадр прямо в буфер кадра; возвращаемый объектImageссылается на этот буфер.Из файла. Передайте путь в конструктор
Image(image.Image("/sd/photo.jpg")); поддерживаемые форматы на диске – это BMP, PPM/PGM, JPEG, PNG и формат записи OpenMVImageIO.Из ndarray. Передайте float32
(h, w)или(h, w, 3)ndarrayв конструкторImage. Пиксели масштабируются из0.0 -- 255.0в изображение GRAYSCALE или RGB565 соответственно. Используйте это, чтобы вернуть тензорный вывод изml(или любого конвейераulab) обратно в изображение, пригодное для рисования.Пустой буфер. Создайте
Imageс заданным размером и форматом пикселей (image.Image(320, 240, image.RGB565)), чтобы рисовать в нём с нуля или использовать как временную поверхность для арифметики над изображениями.
Форматы пикселей¶
Каждое Image имеет один из следующих форматов пикселей; выбор – это компромисс между памятью, стоимостью обработки и тем, какие алгоритмы могут на нём работать. Используйте BINARY, GRAYSCALE, RGB565, BAYER, YUV422, JPEG или PNG в качестве аргумента pixformat при создании изображения или настройке датчика камеры:
BINARY (1 bpp) – один бит на пиксель. Самый компактный формат; используется внутри процедур пороговой обработки и морфологии, но редко захватывается напрямую с датчика.
GRAYSCALE (8 bpp) – один байт на пиксель (канал Y из YUV422). Самый быстрый формат для большинства алгоритмов машинного зрения (AprilTag, обнаружение границ, оптический поток).
RGB565 (16 bpp) – два байта на пиксель, 5 бит красного / 6 бит зелёного / 5 бит синего. Цветовой формат по умолчанию.
BAYER (8 bpp) – необработанные цветные данные в виде шаблона Байера прямо с датчика. Полезно для собственного дебайеринга или для хранения большего числа пикселей в меньшем объёме памяти с последующим дебайерингом по запросу.
YUV422 (16 bpp) – цвет с цветностью, прореженной 4:2:2, два байта на пиксель. Полезно, когда нужны алгоритмы, специфичные для цветности, без полной стоимости RGB.
JPEG / PNG – сжатые буферы. Лучше всего подходят для хранения и передачи по сети. Операции на уровне пикселей сначала требуют
Image.to_grayscale()илиImage.to_rgb565().
Работа с результатами¶
Методы обнаружения / извлечения признаков класса Image возвращают объекты, которые можно перебирать и комбинировать: вызов Image.find_blobs() возвращает список Blob, вызов Image.find_apriltags() возвращает список AprilTag и так далее. Каждый класс результата предоставляет геометрические свойства обнаружения (центроид, ограничивающую рамку, площадь, значение кода и т. д.), так что вы можете действовать на их основе напрямую или передавать их обратно в методы рисования (Image.draw_rectangle(), Image.draw_string(), …).
Вспомогательные функции цветовых пространств¶
Модуль также предоставляет небольшие чистые функции для преобразования отдельных значений пикселей между цветовыми пространствами binary / grayscale / RGB / LAB / YUV. Они полезны, когда нужно преобразовать значения порога или элементы палитры в Python перед передачей их в операции над изображениями; для преобразования целого изображения используйте методы to_* класса Image, которые намного быстрее, чем вызов этих вспомогательных функций в цикле.
Классы¶
- class Image – объект Image
- класс ImageIO – объект ImageIO
- class HaarCascade – дескриптор признаков
- класс Similarity – объект Similarity
- class Histogram – объект Histogram
- класс Percentile – объект Percentile
- class Threshold – Объект Threshold
- класс Statistics – объект Statistics
- class Blob – объект Blob
- класс Line – объект Line
- class Circle – объект Circle
- класс Rect – объект Rectangle
- класс QRCode – объект QRCode
- class AprilTag – объект AprilTag
- class DataMatrix – объект DataMatrix
- class BarCode – объект BarCode
- class Displacement – объект Displacement
- class kptmatch – Объект совпадения ключевых точек
Функции¶
Вспомогательные функции преобразования цветовых пространств¶
Каждая из приведённых ниже функций X_to_Y выполняет одно преобразование значения пикселя. Все они принимают/возвращают значения в канонических диапазонах OpenMV:
binary –
int0 – 1.grayscale –
int0 – 255.RGB – кортеж
(r, g, b)из 8-битных целых чисел (каждое 0 – 255).LAB – кортеж
(l, a, b), гдеLв диапазоне 0 – 100, аA/Bв диапазоне -128 – 127.YUV – кортеж
(y, u, v), гдеYв диапазоне 0 – 255, аU/Vв диапазоне -128 – 127.
Для преобразования целого изображения используйте методы to_* класса Image, которые намного быстрее, чем вызов этих вспомогательных функций в цикле.
- image.grayscale_to_rgb(value: int) Tuple[int, int, int]¶
Преобразует значение grayscale в кортеж RGB.
- image.grayscale_to_lab(value: int) Tuple[int, int, int]¶
Преобразует значение grayscale в кортеж LAB.
- image.grayscale_to_yuv(value: int) Tuple[int, int, int]¶
Преобразует значение grayscale в кортеж YUV.
- image.rgb_to_grayscale(value: Tuple[int, int, int]) int¶
Преобразует кортеж RGB в значение grayscale.
- image.rgb_to_lab(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Преобразует кортеж RGB в кортеж LAB.
- image.rgb_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Преобразует кортеж RGB в кортеж YUV.
- image.lab_to_grayscale(value: Tuple[int, int, int]) int¶
Преобразует кортеж LAB в значение grayscale.
- image.lab_to_rgb(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Преобразует кортеж LAB в кортеж RGB.
- image.lab_to_yuv(value: Tuple[int, int, int]) Tuple[int, int, int]¶
Преобразует кортеж LAB в кортеж YUV.
- image.yuv_to_grayscale(value: Tuple[int, int, int]) int¶
Преобразует кортеж YUV в значение grayscale.
Дескрипторы признаков¶
- image.HaarCascade(path: str, stages: int = -1) Cascade¶
Загружает Haar Cascade и возвращает дескриптор
Cascadeдля использования сImage.find_features().pathможет быть одним из:буквальной строкой
"frontalface"или"eye"для загрузки одного из двух каскадов, встроенных в ROM прошивки, илипутём в файловой системе к пользовательскому двоичному файлу
.cascade, созданному инструментами конвертера каскадов OpenMV.
stagesвыбирает, сколько стадий каскада оценивать во время обнаружения.-1использует все стадии, хранящиеся в файле. Уменьшение этого значения ускоряет обнаружение ценой увеличения числа ложных срабатываний.
- image.load_descriptor(path: str) kp_desc | lbp_desc¶
Загружает дескриптор из файла по пути
pathи возвращает его. Внутренний тег типа файла определяет, какой класс дескриптора будет восстановлен:Дескриптор ключевых точек ORB – сохранённый с помощью
Image.find_keypoints()с последующимimage.save_descriptor().Дескриптор LBP – сохранённый с помощью
Image.find_lbp()с последующимimage.save_descriptor().
- image.save_descriptor(descriptor: kp_desc | lbp_desc, path: str) None¶
Сериализует
descriptor(дескриптор ключевых точек ORB или дескриптор LBP) в файл по путиpathв формате файла дескриптора OpenMV. Этот же файл можно позже загрузить заново черезimage.load_descriptor().
- image.match_descriptor(descriptor0, descriptor1, threshold: int = 85, filter_outliers: bool = False) int | kptmatch¶
Сопоставляет два дескриптора одного типа.
Для двух дескрипторов LBP – возвращает целочисленное расстояние Хэмминга между ними (меньшее значение означает более близкое совпадение).
Для двух дескрипторов ключевых точек ORB – возвращает
kptmatch, описывающий кластер сопоставленных ключевых точек, илиNone, если ни одно совпадение не проходитthreshold.
threshold(0 – 100) задаёт, насколько строгим является сопоставление ORB при принятии пары ключевых точек. Меньшие значения ужесточают сопоставление, отклоняя слабые совпадения по ближайшему соседу.filter_outliersвключает отбраковку выбросов в стиле RANSAC по набору сопоставленных ключевых точек. Используйте это, когда ожидаете единое жёсткое преобразование между двумя видами; отключите, когда сопоставленные ключевые точки охватывают несколько объектов.
Вспомогательные функции геометрии блобов¶
Эти вспомогательные функции принимают Blob (как возвращается Image.find_blobs()) и вычисляют дополнительные геометрические свойства по запросу. Они находятся на уровне модуля – а не у Blob, – поэтому базовый путь find_blobs() не несёт затрат на них, пока вы их не запросите.
- image.get_solidity(blob: blob) float¶
Возвращает плотность (
blob.pixels / convex_hull_area) блобаblob. Число с плавающей точкой, 0 – 1; 1.0 означает, что блоб полностью заполняет свою выпуклую оболочку.
- image.get_convexity(blob: blob) float¶
Возвращает выпуклость (
convex_hull_perimeter / blob.perimeter) блобаblob. Число с плавающей точкой, 0 – 1; 1.0 – это идеально выпуклый блоб.
- image.get_major_axis_line(blob: blob) line¶
Возвращает
Lineвдоль большой оси блобаblob(более длинной из двух главных осей повёрнутого прямоугольника минимальной площади).
- image.get_minor_axis_line(blob: blob) line¶
Возвращает
Lineвдоль малой оси блобаblob(более короткой из двух главных осей повёрнутого прямоугольника минимальной площади).
- image.get_enclosed_ellipse(blob: blob) Tuple[int, int, int, int, int]¶
Возвращает кортеж из 5 элементов
(cx, cy, a, b, rotation), описывающий эллипс, вписанный в повёрнутый прямоугольник минимальной площади вокруг блобаblob:cx/cy– центр эллипса в пикселях (целое число).a/b– длины полуосей в пикселях (целое число).rotation– поворот эллипса в градусах (целое число).
Это обычный кортеж, а не attrtuple, поэтому к полям можно обращаться только по индексу.
Константы¶
Форматы пикселей¶
Передайте любое из следующих значений в качестве аргумента pixformat конструктору Image или методу csi.CSI.pixformat().
- image.BINARY: int¶
Растровое изображение с 1 битом на пиксель. Самый компактный формат – используется внутри пороговой обработки и морфологии, редко захватывается напрямую с датчика.
- image.GRAYSCALE: int¶
Оттенки серого с 8 битами на пиксель (один байт на пиксель). Самый быстрый формат для большинства алгоритмов машинного зрения (AprilTag, обнаружение границ, оптический поток).
- image.RGB565: int¶
Цвет с 16 битами на пиксель, упакованный как 5 бит красного / 6 бит зелёного / 5 бит синего. Цветовой формат по умолчанию.
- image.BAYER: int¶
Необработанные данные Байера с 8 битами на пиксель прямо с датчика. Большинство методов обработки изображений недоступны для изображений Байера; используйте это, когда хотите выполнять дебайеринг по запросу или хранить больше пикселей в меньшем объёме памяти.
- image.YUV422: int¶
Цвет с цветностью, прореженной 4:2:2, два байта на пиксель, упакованный как
Y1, U, Y2, Vна пару пикселей. Только некоторые методы обработки изображений работают напрямую с YUV422.
- image.JPEG: int¶
Сжатый буфер JPEG. Операции на уровне пикселей сначала требуют
Image.to_grayscale()илиImage.to_rgb565().
- image.PNG: int¶
Сжатый буфер PNG. Операции на уровне пикселей сначала требуют
Image.to_grayscale()илиImage.to_rgb565().
Цветовые палитры¶
Передайте любое из следующих значений в Image.to_rainbow(), Image.to_ironbow(), Image.draw_image() (color_palette=) или в csi.CSI.color_palette(), чтобы раскрасить изображение в оттенках серого.
- image.PALETTE_RAINBOW: int¶
Гладкое цветовое колесо радуги. Палитра OpenMV по умолчанию для тепловизионных изображений.
- image.PALETTE_IRONBOW: int¶
Нелинейная палитра «ironbow», имитирующая вид видоискателя тепловизора FLIR Lepton.
- image.PALETTE_DEPTH: int¶
Палитра для изображений глубины. Доступна только в сборках с поддержкой датчика глубины (конвейер ToF – например, OpenMV Cam AE3 или любая камера с подключённым модулем ToF Pmod).
- image.PALETTE_EVT_DARK: int¶
Палитра для визуализации кадров событийной камеры GENX320 на тёмном фоне. Передайте в
csi.CSI.color_palette, чтобы драйвер GENX320 выдавал раскрашенные кадры RGB565 в режиме гистограммы, или вImage.draw_image()color_palette=при раскрашивании событийного изображения в оттенках серого.Доступна только в сборках с поддержкой GENX320 (OpenMV Cam AE3 и Pmod GENX320).
- image.PALETTE_EVT_LIGHT: int¶
Палитра для визуализации кадров событийной камеры GENX320 на светлом фоне. Та же диспетчеризация и доступность, что и у
PALETTE_EVT_DARK.
Режимы масштабирования¶
Передайте любое из следующих значений в качестве аргумента hint методам Image.draw_image(), Image.scale() или аналогичным методам масштабирования.
Подсказки рисования / draw_image¶
Объедините любые из них побитовым ИЛИ и передайте в качестве аргумента hint метода Image.draw_image().
- image.CENTER: int¶
Центрировать источник на месте назначения. Любые явные смещения x/y тогда становятся смещениями от центра, а не от верхнего левого угла.
- image.EXTRACT_RGB_CHANNEL_FIRST: int¶
При извлечении канала RGB через
Image.draw_image()извлекать канал до масштабирования. Без этой подсказки канал извлекается после масштабирования.
- image.APPLY_COLOR_PALETTE_FIRST: int¶
При применении цветовой палитры через
Image.draw_image()применять палитру до масштабирования. Без этой подсказки палитра применяется после масштабирования.
- image.SCALE_ASPECT_KEEP: int¶
Масштабировать источник так, чтобы он поместился внутри места назначения с сохранением соотношения сторон (добавляет поля при различных соотношениях).
- image.SCALE_ASPECT_EXPAND: int¶
Масштабировать источник так, чтобы он заполнил место назначения с сохранением соотношения сторон (обрезает при различных соотношениях).
- image.SCALE_ASPECT_IGNORE: int¶
Масштабировать источник так, чтобы он заполнил место назначения, игнорируя соотношение сторон.
Субдискретизация JPEG¶
Передайте любое из следующих значений в качестве аргумента subsampling методам Image.to_jpeg(), Image.compress() или Image.save() при записи JPEG.
- image.JPEG_SUBSAMPLING_AUTO: int¶
Выбрать субдискретизацию цветности автоматически на основе настройки качества JPEG.
- image.JPEG_SUBSAMPLING_444: int¶
Принудительно использовать субдискретизацию цветности 4:4:4 (без сжатия цветности).
Сопоставление по шаблону¶
Передайте любое из следующих значений в качестве аргумента search методу Image.find_template().
Обнаружение границ¶
Передайте любое из следующих значений в качестве аргумента algorithm методу Image.find_edges().
- image.EDGE_CANNY: int¶
Детектор границ Кэнни – величина градиента + подавление немаксимумов + гистерезис. Более высокое качество, медленнее.
- image.EDGE_SIMPLE: int¶
Детектор границ на основе порогового высокочастотного фильтра. Быстрее, но даёт более толстые и зашумлённые границы, чем
EDGE_CANNY.
Детекторы углов ORB¶
Передайте любое из следующих значений в качестве аргумента corner_detector методу Image.find_keypoints().
- image.CORNER_FAST: int¶
Детектор углов FAST. Быстрее, чем
CORNER_AGAST, но менее точный.
- image.CORNER_AGAST: int¶
Детектор углов AGAST. Медленнее, чем
CORNER_FAST, но даёт более стабильные ключевые точки.
Семейства AprilTag¶
Объедините побитовым ИЛИ любую комбинацию следующих значений и передайте в качестве аргумента families методу Image.find_apriltags(). Каждое семейство управляется собственной опцией сборки в прошивке; неподдерживаемые семейства отсутствуют во время выполнения, а не всегда равны нулю.
Символики штрихкодов¶
Значения, сообщаемые в BarCode.type для записей, возвращаемых Image.find_barcodes().
- image.PDF417: int¶
Двумерный многоуровневый штрихкод PDF417. Константа существует для полноты, но декодер штрихкодов в настоящее время не реализует PDF417 –
Image.find_barcodes()не будет возвращать обнаружения этого типа.