5.6. Малювання фігур і тексту¶
Алгоритм, який робить висновок про зображення, часто потребує, щоб цей висновок був видимим. Детектор плям знаходить область, що цікавить програму; програма хоче, щоб область була намальована на кадрі, щоб оператор – або розробник, який запускає скрипт – міг бачити знайдене. Перетворення координат відображає вхідну позицію у вихідну; налагодження зазвичай означає позначення двох позицій на одному зображенні. Попередній перегляд IDE зчитує все, що знаходиться в кадровому буфері на момент опитування, тому найпростіший спосіб зробити вихід алгоритму видимим – записати анотації безпосередньо у кадровий буфер. Сімейство методів малювання класу Image – це інструментарій саме для такої роботи.
5.6.1. Примітиви¶
Кожен метод малювання розміщує на зображенні один конкретний вид мітки. Каталог невеликий і наближений до геометричних примітивів, що справді потрібні для анотації:
draw_line()– пряма лінія між двома кінцевими точками.draw_rectangle()– вирівняний по осях прямокутник, порожній або залитий.draw_circle()– коло навколо центру, порожнє або залите.draw_ellipse()– еліпс з довільним кутом повороту.draw_cross()– знак плюс у точці, стандартна мітка для центроїда або цільової точки кліку.draw_arrow()– стрілка від початкової точки до кінцевої.draw_edges()– чотири сторони довільного чотирикутника за чотирма кутовими точками; природний спосіб обведення виявленого тегу або ділянки з перспективним спотворенням.draw_string()– текст із вбудованого растрового шрифту.
Кожен із цих методів змінює вихідне зображення на місці та повертає те саме зображення для ланцюгування, дотримуючись конвенції операційних методів, встановленої раніше.
Вісім примітивів малювання, по одному на панель. Кожен метод створює один вид мітки.¶
5.6.2. Колір¶
Кожен метод малювання приймає аргумент color, що визначає значення, яке записується в кожен зафарбований піксель. Форма цього аргументу залежить від формату зображення. Для зображення RGB565 природною формою є кортеж (r, g, b) з кожним каналом у діапазоні 0 – 255; модуль пакує його в 16-бітне слово RGB565 перед записом. Для зображення у відтінках сірого природною формою є ціле число яскравості від 0 (чорний) до 255 (білий). Методи також приймають сире збережене значення формату – 16-бітне упаковане слово для RGB565, 8-бітне ціле число для відтінків сірого – що є ефективною формою, коли колір обчислено деінде і вже знаходиться у збереженій формі.
Пропуск аргументу color малює білим. Це значення за замовчуванням зручне для роботи у відтінках сірого, де білий є максимальним значенням і добре читається на більшості фонів. Для налагоджувальних накладень RGB565 воно майже завжди неправильне: зелений або червоний зазвичай краще читається на тлі типових сцен, що бачить камера, а явний колір виражає намір.
5.6.3. Товщина та заливка¶
Більшість геометричних методів приймають два прапори, що визначають спосіб малювання мітки:
thickness=Nвстановлює товщину лінії у пікселях. Значення за замовчуванням –1, що підходить для більшості накладень; більше значення корисне, коли анотація має залишатися видимою на насиченій сцені або після того, як наступний етап конвеєра модифікує зображення.fill=Trueперемикає мітку з контуру на суцільну, зафарбовуючи кожен внутрішній піксель вибраним кольором. Значення за замовчуванням –False.
Ці прапори не застосовуються до примітивів, у яких немає внутрішньої частини для заливки – лінії, хреста, стрілки, чотирикутника – де значення має лише thickness.
5.6.4. Малювання тексту¶
draw_string() виводить символи вбудованого растрового шрифту розміром 8 на 10 пікселів. x і y – верхній лівий кут комірки першого символу, text – рядок для малювання, а color дотримується тієї самої конвенції, що й геометричні методи. Шрифт охоплює повний діапазон друкованих символів ASCII і не має кернінгу – кожен символ займає однакову комірку шириною 8 пікселів – що робить виведення зручним для позиціонування.
img.draw_string(10, 10, "blobs: 3", color=(0, 255, 0))
Рядок може містити символи нового рядка (\n); кожен такий символ переміщує наступний символ на початок нового рядка на десять пікселів нижче попереднього. Аргумент scale малює кожен символ у збільшеному розмірі за допомогою коефіцієнта з рухомою комою, а x_spacing і y_spacing додають відступи навколо кожного символу. Невеликий набір прапорів повороту, дзеркального відображення та перевертання застосовується або до всього рядка, або до кожного символу окремо – достатньо контролю для розміщення тексту під кутом або вздовж не горизонтальної межі, коли цього вимагає компонування.
5.6.5. Очищення полотна¶
Один метод сімейства не малює жодної конкретної мітки. Він просто скидає кожен піксель зображення до нуля:
clear()– обнулити кожен піксель, за бажанням обмежившись ROI або застосувавши маску.
clear() – правильний варіант, коли програма складає анотацію з нуля для кожного кадру – починає з чорного полотна, малює нові анотації, передає результат на дисплей – замість накладення поверх захопленого кадру. Це також найдешевший спосіб підготувати тимчасове зображення для використання як буфер маски.
Щойно виділене зображення вже нульове після конструктора, тому clear() має значення переважно для буферів, що повторно використовуються між кадрами.