image — технічний зір

Модуль image є серцем стеку технічного зору OpenMV. Він надає клас Image – піксельний буфер у пам’яті, над яким працюють усі процедури малювання, фільтрації, трансформації та вилучення ознак – разом із допоміжними об’єктами результатів, що повертаються цими процедурами (Blob, Line, Circle, Rect, QRCode, AprilTag, DataMatrix, BarCode, …) та допоміжними класами для їхнього налаштування (Threshold, Histogram, Statistics, HaarCascade, Similarity, Percentile, Displacement, ImageIO).

Отримання зображення

Існує чотири способи завантажити Image у RAM:

  • Захоплення живого відео з датчика камери. Викличте csi.CSI.snapshot(), щоб захопити наступний кадр безпосередньо у кадровий буфер; повернений Image посилається на цей буфер.

  • З файлу. Передайте шлях до конструктора Image (image.Image("/sd/photo.jpg")); підтримувані формати на диску: BMP, PPM/PGM, JPEG, PNG та формат запису OpenMV ImageIO.

  • З 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 бпп) – один біт на піксель. Найменший формат; використовується внутрішньо процедурами порогування та морфології, але рідко захоплюється безпосередньо з датчика.

  • GRAYSCALE (8 бпп) – один байт на піксель (канал Y з YUV422). Найшвидший формат для більшості алгоритмів технічного зору (AprilTag, виявлення меж, оптичний потік).

  • RGB565 (16 бпп) – два байти на піксель: 5-біт червоного / 6-біт зеленого / 5-біт синього. Формат кольору за замовчуванням.

  • BAYER (8 бпп) – необроблені кольорові дані шаблону Байєра прямо з датчика. Корисний для власного демозаїкування або для збереження більшої кількості пікселів у меншій пам’яті до дебаєризації на вимогу.

  • YUV422 (16 бпп) – колір із субдискретизацією хроми 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(), …).

Допоміжні функції кольорового простору

Модуль також надає невеликі чисті функції для перетворення окремих значень пікселів між бінарним / відтінками сірого / RGB / LAB / YUV кольоровими просторами. Вони корисні, коли потрібно перетворити значення порогів або записи палітри на Python перед передачею до операцій над зображеннями – для перетворення повних зображень використовуйте методи to_* класу Image, які значно швидші, ніж виклик цих допоміжних функцій у циклі.

Класи

Функції

Допоміжні функції перетворення кольорового простору

Кожна з наведених нижче функцій X_to_Y виконує перетворення значення одного пікселя. Всі вони приймають/повертають значення в канонічних діапазонах OpenMV:

  • binary – int від 0 до 1.

  • grayscale – int від 0 до 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.binary_to_grayscale(value: int) int

Перетворює бінарне значення у значення відтінків сірого.

image.binary_to_rgb(value: int) Tuple[int, int, int]

Перетворює бінарне значення у кортеж RGB.

image.binary_to_lab(value: int) Tuple[int, int, int]

Перетворює бінарне значення у кортеж LAB.

image.binary_to_yuv(value: int) Tuple[int, int, int]

Перетворює бінарне значення у кортеж YUV.

image.grayscale_to_binary(value: int) int

Перетворює значення відтінків сірого у бінарне значення.

image.grayscale_to_rgb(value: int) Tuple[int, int, int]

Перетворює значення відтінків сірого у кортеж RGB.

image.grayscale_to_lab(value: int) Tuple[int, int, int]

Перетворює значення відтінків сірого у кортеж LAB.

image.grayscale_to_yuv(value: int) Tuple[int, int, int]

Перетворює значення відтінків сірого у кортеж YUV.

image.rgb_to_binary(value: Tuple[int, int, int]) int

Перетворює кортеж RGB у бінарне значення.

image.rgb_to_grayscale(value: Tuple[int, int, int]) int

Перетворює кортеж RGB у значення відтінків сірого.

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_binary(value: Tuple[int, int, int]) int

Перетворює кортеж LAB у бінарне значення.

image.lab_to_grayscale(value: Tuple[int, int, int]) int

Перетворює кортеж LAB у значення відтінків сірого.

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_binary(value: Tuple[int, int, int]) int

Перетворює кортеж YUV у бінарне значення.

image.yuv_to_grayscale(value: Tuple[int, int, int]) int

Перетворює кортеж YUV у значення відтінків сірого.

image.yuv_to_rgb(value: Tuple[int, int, int]) Tuple[int, int, int]

Перетворює кортеж YUV у кортеж RGB.

image.yuv_to_lab(value: Tuple[int, int, int]) Tuple[int, int, int]

Перетворює кортеж YUV у кортеж LAB.

Дескриптори ознак

image.HaarCascade(path: str, stages: int = -1) Cascade

Завантажує каскад Хаара та повертає дескриптор Cascade для використання з Image.find_features().

path може бути одним із наступного:

  • рядковий літерал "frontalface" або "eye" для завантаження одного з двох каскадів, вбудованих у ROM мікропрограми, або

  • шлях файлової системи до власного бінарного файлу .cascade, створеного інструментами конвертера каскадів OpenMV.

stages визначає кількість стадій каскаду для оцінювання під час виявлення. -1 використовує всі стадії, збережені у файлі. Зменшення цього значення прискорює виявлення ціною більшої кількості хибних спрацювань.

image.load_descriptor(path: str) kp_desc | lbp_desc

Завантажує дескриптор з файлу за path та повертає його. Внутрішній тег типу файлу визначає, який клас дескриптора відновлюється:

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. Float від 0 до 1; 1.0 означає, що пляма повністю заповнює свою опуклу оболонку.

image.get_convexity(blob: blob) float

Повертає опуклість (convex_hull_perimeter / blob.perimeter) blob. Float від 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_enclosing_circle(blob: blob) circle

Повертає Circle, що охоплює 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-бітний піксельний необроблений Bayer-дані прямо з датчика. Більшість методів обробки зображень недоступна для Bayer-зображень; використовуйте це, коли хочете виконати дебаєризацію на вимогу або зберігати більше пікселів у меншій пам’яті.

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 та GENX320 Pmod).

image.PALETTE_EVT_LIGHT: int

Палітра для візуалізації кадрів події камери GENX320 на світлому тлі. Таке саме призначення та доступність, як і PALETTE_EVT_DARK.

Режими масштабування

Передайте будь-яке з наступного як аргумент hint до Image.draw_image(), Image.scale() або аналогічних методів масштабування.

image.AREA: int

Масштабувальник із усередненням площі. Використовується при зменшенні масштабу; для збільшення масштабу використовується метод найближчого сусіда.

image.BILINEAR: int

Білінійний масштабувальник. Виконує підвибірку при зменшенні масштабу.

image.BICUBIC: int

Бікубічний масштабувальник. Вища якість, ніж BILINEAR, але повільніший. Виконує підвибірку при зменшенні масштабу.

Підказки малювання / draw_image

Об’єднайте будь-які з них через побітове АБО та передайте як аргумент hint методу Image.draw_image().

image.VFLIP: int

Вертикально відзеркалити джерело під час малювання.

image.HMIRROR: int

Горизонтально відзеркалити джерело під час малювання.

image.TRANSPOSE: int

Транспонувати (поміняти x/y місцями) джерело під час малювання.

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

Масштабувати джерело, щоб воно вміщалося всередині місця призначення зі збереженням пропорцій (застосовує «letterbox», коли пропорції відрізняються).

image.SCALE_ASPECT_EXPAND: int

Масштабувати джерело, щоб заповнити місце призначення зі збереженням пропорцій (обрізає, коли пропорції відрізняються).

image.SCALE_ASPECT_IGNORE: int

Масштабувати джерело для заповнення місця призначення, ігноруючи пропорції.

image.BLACK_BACKGROUND: int

Повідомити шляху альфа-змішування, що місце призначення є завідомо чорним, щоб можна було пропустити зчитування пікселя призначення. Прискорює альфа-ефекти на щойно очищених буферах.

image.ROTATE_90: int

Скорочення для VFLIP | TRANSPOSE (поворот на 90 градусів за годинниковою стрілкою).

image.ROTATE_180: int

Скорочення для HMIRROR | VFLIP (поворот на 180 градусів).

image.ROTATE_270: int

Скорочення для HMIRROR | TRANSPOSE (поворот на 270 градусів за годинниковою стрілкою).

Субдискретизація JPEG

Передайте будь-яке з наступного як аргумент subsampling до Image.to_jpeg(), Image.compress() або Image.save() при записі JPEG.

image.JPEG_SUBSAMPLING_AUTO: int

Автоматичний вибір субдискретизації хроми на основі налаштування якості JPEG.

image.JPEG_SUBSAMPLING_444: int

Примусова субдискретизація хроми 4:4:4 (без стиснення хроми).

image.JPEG_SUBSAMPLING_422: int

Примусова субдискретизація хроми 4:2:2. Рекомендується при потоковій передачі MJPEG стороннім відеоплеєрам, які некоректно поводяться з 4:2:0.

image.JPEG_SUBSAMPLING_420: int

Примусова субдискретизація хроми 4:2:0.

Шаблонне зіставлення

Передайте будь-яке з наступного як аргумент search до Image.find_template().

image.SEARCH_EX: int

Вичерпний пошук – оцінює кожну позицію в ROI. Найповільніший, але гарантовано знаходить найкращий збіг.

image.SEARCH_DS: int

Ромбовидний пошук – пошук від грубого до точного, значно швидший, ніж SEARCH_EX, але може пропустити глобальний оптимум на дуже самоподібних шаблонах.

Виявлення меж

Передайте будь-яке з наступного як аргумент 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(). Кожне сімейство контролюється власною опцією збірки у мікропрограмі; непідтримувані сімейства відсутні під час виконання, а не завжди рівні нулю.

image.TAG16H5: int

Сімейство AprilTag 16h5 (30 унікальних ідентифікаторів, корекція помилок 0 біт).

image.TAG25H9: int

Сімейство AprilTag 25h9 (35 унікальних ідентифікаторів, корекція помилок до 3 біт).

image.TAG36H10: int

Сімейство AprilTag 36h10 (2320 унікальних ідентифікаторів, корекція помилок до 3 біт).

image.TAG36H11: int

Сімейство AprilTag 36h11 (587 унікальних ідентифікаторів, корекція помилок до 4 біт). Найпоширеніше сімейство.

image.TAGCIRCLE21H7: int

Сімейство AprilTag Circle21h7.

image.TAGCIRCLE49H12: int

Сімейство AprilTag Circle49h12.

image.TAGCUSTOM48H12: int

Сімейство AprilTag Custom48h12.

image.TAGSTANDARD41H12: int

Сімейство AprilTag Standard41h12.

image.TAGSTANDARD52H13: int

Сімейство AprilTag Standard52h13.

Символіки штрих-кодів

Значення, що повідомляються в BarCode.type для записів, повернених Image.find_barcodes().

image.EAN2: int

Додатковий штрих-код EAN-2.

image.EAN5: int

Додатковий штрих-код EAN-5.

image.EAN8: int

Штрих-код EAN-8.

image.UPCE: int

Штрих-код UPC-E.

image.ISBN10: int

Штрих-код ISBN-10.

image.UPCA: int

Штрих-код UPC-A.

image.EAN13: int

Штрих-код EAN-13.

image.ISBN13: int

Штрих-код ISBN-13.

image.I25: int

Чередований штрих-код 2-з-5.

image.DATABAR: int

Штрих-код GS1 DataBar.

image.DATABAR_EXP: int

Розширений штрих-код GS1 DataBar.

image.CODABAR: int

Штрих-код Codabar.

image.CODE39: int

Штрих-код Code 39.

image.PDF417: int

Двовимірний складений штрих-код PDF417. Константа існує для повноти, але декодер штрих-кодів наразі не реалізує PDF417 – Image.find_barcodes() не повертатиме виявлень цього типу.

image.CODE93: int

Штрих-код Code 93.

image.CODE128: int

Штрих-код Code 128.