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 та формат запису 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 бпп) – один біт на піксель. Найменший формат; використовується внутрішньо процедурами порогування та морфології, але рідко захоплюється безпосередньо з датчика.
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, які значно швидші, ніж виклик цих допоміжних функцій у циклі.
Класи¶
- клас Image – об’єкт зображення
- клас ImageIO – об’єкт ImageIO
- клас HaarCascade – Дескриптор ознак
- клас Similarity – об’єкт Similarity
- клас Histogram – об’єкт Histogram
- клас Percentile – об’єкт Percentile
- клас Threshold – Об’єкт порогу
- клас Statistics – об’єкт Statistics
- клас Blob – об’єкт Blob
- клас Line – об’єкт Line
- клас Circle – об’єкт Circle
- клас Rect – об’єкт Rectangle
- клас QRCode – об’єкт QRCode
- клас AprilTag – об’єкт AprilTag
- клас DataMatrix – об’єкт DataMatrix
- клас BarCode – об’єкт BarCode
- клас Displacement – об’єкт Displacement
- клас kptmatch – Об’єкт збігу ключових точок
Функції¶
Допоміжні функції перетворення кольорового простору¶
Кожна з наведених нижче функцій 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.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_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_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_grayscale(value: Tuple[int, int, int]) int¶
Перетворює кортеж YUV у значення відтінків сірого.
Дескриптори ознак¶
- 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та повертає його. Внутрішній тег типу файлу визначає, який клас дескриптора відновлюється:Дескриптор ключових точок 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. 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_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() або аналогічних методів масштабування.
Підказки малювання / 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¶
Масштабувати джерело, щоб воно вміщалося всередині місця призначення зі збереженням пропорцій (застосовує «letterbox», коли пропорції відрізняються).
- image.SCALE_ASPECT_EXPAND: int¶
Масштабувати джерело, щоб заповнити місце призначення зі збереженням пропорцій (обрізає, коли пропорції відрізняються).
- image.SCALE_ASPECT_IGNORE: int¶
Масштабувати джерело для заповнення місця призначення, ігноруючи пропорції.
- image.BLACK_BACKGROUND: int¶
Повідомити шляху альфа-змішування, що місце призначення є завідомо чорним, щоб можна було пропустити зчитування пікселя призначення. Прискорює альфа-ефекти на щойно очищених буферах.
Субдискретизація JPEG¶
Передайте будь-яке з наступного як аргумент subsampling до Image.to_jpeg(), Image.compress() або Image.save() при записі JPEG.
- image.JPEG_SUBSAMPLING_AUTO: int¶
Автоматичний вибір субдискретизації хроми на основі налаштування якості JPEG.
Шаблонне зіставлення¶
Передайте будь-яке з наступного як аргумент 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(). Кожне сімейство контролюється власною опцією збірки у мікропрограмі; непідтримувані сімейства відсутні під час виконання, а не завжди рівні нулю.
- image.TAG16H5: int¶
Сімейство AprilTag
16h5(30 унікальних ідентифікаторів, корекція помилок 0 біт).
- image.TAG25H9: int¶
Сімейство AprilTag
25h9(35 унікальних ідентифікаторів, корекція помилок до 3 біт).
- image.TAG36H10: int¶
Сімейство AprilTag
36h10(2320 унікальних ідентифікаторів, корекція помилок до 3 біт).
Символіки штрих-кодів¶
Значення, що повідомляються в BarCode.type для записів, повернених Image.find_barcodes().
- image.PDF417: int¶
Двовимірний складений штрих-код PDF417. Константа існує для повноти, але декодер штрих-кодів наразі не реалізує PDF417 –
Image.find_barcodes()не повертатиме виявлень цього типу.