Виявлення кольорового згустку на зображенні
Оценка пользователей: / 6
ПлохоОтлично 
There are no translations available.

Robot_directionЦя стаття ґрунтується на попередній про основи обробки зображень за допомогою Python і модуля обробки зображень, щоб знайти згусток кольору на зображенні.
Для початку створіть файл з ім'ям blob.py. Це буде основою для нашого сценарію знаходження згустку. Після того як ви створили файл, відкрийте його в текстовому редакторі.
Як і в попередньому уроці, будемо використовувати модуль обробки зображень і нам треба буде ініціалізувати вікно і камеру для захоплення зображень.
from imgproc import *

# створюємо змінну cam
cam = Camera(320, 240)

# використовуємо ширину і висоту для камери, щоб задати розміри для перегляду
view = Viewer(cam.width, cam.height, "Blob finding")
Тепер у нас є переглядач, щоб бачити зображення, а також камера для зйомки зображень. Наступний рядок, який ми додаємо, буде незнайомий:
# цикл без кінця, поки користувач не вийде
while True:
В цьому циклі буде знаходитись решта нашого сценарію. Цикл продовжуватиме виконуватися, поки користувач не завершить програму натисканням Ctrl+C.
Далі захопимо зображення з камери і покажемо його.
  # захопити зображення з камери
  image = cam.grabImage()

  # покладемо наш код, що залишився, сюди

  # вивести зображення на переглядач
  view.displayImage(image)
Оскільки ці рядки в тому ж циклі, то буде нескінченно захоплюватися зображення з камери і відображатися на екрані, поки користувач не вийде.
Запустіть зараз цей сценарій, щоб перевірити, що немає ніяких синтаксичних помилок. Повинно створитися вікно на екрані і відображатися потік зображень з веб-камери. Закрити вікно можна натиснувши клавішу escape (вихід).
Наша наступна мета полягає в тому, щоб спробувати виявити краплю кольору в цьому зображенні. Спробуйте знайти що-небудь поблизу, що яскраво-зелене, червоне або синє. Ми постараємося знайти об'єкт на зображенні, фільтруючи інші кольори, потім намалюємо маркером в його центрі.
Перш за все, ми повинні спробувати визначити колір нашого об'єкта і відфільтрувати всі інші. Ми зробимо це за допомогою перебору кожного пікселя, і шляхом порівняння їх червоної, зеленої та синьої інтенсивності між собою.
В статті з основ, ми виділяли переважно червоні кольори, так що давайте почнемо звідти. Переконайтеся, що ви помістіть цей код після захоплення зображення з камери, і перед вами воно відображається. Слід також зробити відступ, бо це частина циклу while.
for x in range(0, image.width):
  for y in range(0, image.height):
    # отримати значення поточного пікселя
    red, green, blue = image[x, y]

    # перевірити, чи перевищує інтенсивність червоного зелений і синій
    if red > green and red > blue:
      # колір пікселів, які пройшли тест, чорний
      image[x, y] = 0, 0, 0
Важливим рядком є умова:
if red > green and red > blue:
Тестуючи інтенсивність окремих каналів, по-різному порівнюючи один з одним, ми можемо визначити наш потрібний колір. Ось кілька трюків, які спробують допомогти вам підібрати свій колір:
# перевірка, чи зелений канал більш інтенсивний, ніж 128 (половина інтенсивності)
if green > 128:

# перевірка чи червоний більш ніж удвічі інтенсивніший, ніж канал зеленого
if red > (2 * green):

# тут ми шукаємо колір, в якому значення блакитного більше 64
# і синій більш, ніж в 3/2 рази інтенсивніший від зеленого
if blue > 64 and blue > (3 / 2 * green):

# альтернативний спосіб записаного вище, шляхом використання конструкції if
if blue > 64:
  if blue > (3 / 2 * green):
    # код тут
255 є максимальним значенням для каналу, але більшу частину часу кольори набагато менш інтенсивні, ніж це значення. Почніть фільтрувати з дуже малої кількості пікселів і повільно звужуйте значення поки у вас не залишиться тільки ваш забарвлений об'єкт. Ви не зможете позбавитися від всього шуму, так що не надто сильно турбуйтеся. Також треба буде прийняти декілька зображень, поки камера повністю не відкалібрується, так що це займе також час, щоб стабілізуватися. Продовжуйте пробувати, поки не підібрали.
Ви, мабуть, помітите, як тільки почнете перевіряти, що потрібний певний час для появи на екрані кожного нового зображення. Це тому, що тестування кожного пікселя в зображенні є досить повільною операцією. Ми можемо прискорити цей процес, працюючи з зображенням більш низької якості. Щоб зробити цю зміну розмірів, ми перемикнемо камеру до більш низької роздільної здатності:
cam = Camera(160, 120)
або, навіть
cam = Camera(80, 60)
Це зробить наше вікно меншим, що для наших цілей чудово, бо означає, що ми повинні перебрати менше пікселів.
Сподіваюся, що тепер ваш об'єкт фільтрується і повертається чорним. Наступним етапом є визначення центру чорних пікселів. Ми це будемо робити, знаходячи середнє положення всіх чорних пікселів. Ви можете вибрати будь-який метод усереднення, який вам подобається; в нашому прикладі використовується середнє значення.
Щоб обчислити середнє значення, необхідно додати всі значення і розділити на загальну кількість елементів. В нашому випадку "значеннями" є позиції х і у, а загальна сума становить число чорних пікселів.
Можемо зробити це досить легко, як ми раніше перебирали всі наші пікселів. Будемо акумулювати позиції х і у, до який прийдемо, і збільшувати на одиницю лічильник кількості чорних пікселів. В кінці ми можемо розділити накопичені значення х і у на загальну кількість, щоб отримати середні позиції х та у, які представляють собою центр нашого згустку.
Ось структура коду, який це зробить.
По-перше, ми повинні створити змінні. Вони повинні ініціалізуватися щоразу, коли запускається цикл, так що розмістимо це відразу після відкриття while:
while True:
  # акумулятори позицій x і у
  acc_x = 0
  acc_y = 0

  # кількість накопичених пікселів
  acc_count = 0

  # перебираємо кожен піксель
  …
Тепер, щоразу, коли ми знаходимо піксель нашого кольору об'єктів, ми повинні додати до значень цих змінних.
Для кожного пікселя:
# замінити цим ваш тест пікселів
if red > green and red > blue:
  # додати х і у знайденого пікселя до акумулятора
  acc_x += x
  acc_y += y
  # збільшуємо лічильник накопичених пікселів
  acc_count += 1
  # тут змінити колір пікселя на чорний
  image[x, y] = 0, 0, 0
До кінця ітерації пікселів, будемо накопичувати кількість пікселів та їх х і у координати. Останній крок полягає в розрахунку центральної точки і малюванні хрестика на ній. Не забутьте зробити це раніше, ніж показувати зображення.
# перевірити, чи акумулятор лічильника більший нуля, щоб уникнути ділення на нуль
if acc_count > 0:
  # обчислити середнє позицій х та у
  mean_x = acc_x / acc_count
  mean_y = acc_y / acc_count

  # намалювати малий хрестик в червоному на середній позиції
  image[mean_x + 0, mean_y - 1] = 255, 0, 0
  image[mean_x – 1, mean_y + 0] = 255, 0, 0
  image[mean_x + 0, mean_y + 0] = 255, 0, 0
  image[mean_x + 1, mean_y + 0] = 255, 0, 0
  image[mean_x + 0, mean_y + 1] = 255, 0, 0
Запустіть програму і вона знайде центр кольору вашого об'єкта та намалює червоний хрест над ним.
На цьому даний урок закінчимо. На наступних уроках ми будемо використовувати більш потужні функціональні можливості, щоб зробити швидшим і більш складним виявлення та обробку. Якщо хочете проекспериментувати, то є документація модуля і його функцій. Повний лістинг коду для цього уроку можна знайти тут.
ДОДАТОК
Спробуйте використати положення згустку, щоб контролювати, в якому напрямку повинен рухатися робот. (Див. підручник з управління роботом для більш докладної інформації.) Якщо згусток знаходиться зліва від центру зображення, то ліве колесо робота повинно рухатися повільніше, і навпаки. Тепер ви в змозі побудувати робота, що переслідував би яскраво-забарвлений об'єкт, який ви тримаєте перед ним, або навіть світлодіод на іншому роботі!
(Джерело EN: cl.cam.ac.uk)
 
>
КнигаНовости Практика поискаПартнерыО нас
Підтримка та дизайн: Могильний С.С. Шаблон: Joomla Templates by BuyHTTP Joomla Hosting