Архив метки: распознавание креста

Детектирование креста на изображении с помощью OpenCV

Это одна из самых первых моих работ на Python и OpenCV. Для участия в конкурсе летательных аппаратов КРОК 2013 необходимо было научить квадрокоптер приземляться на метку диаметром 3 метра, на которой черным по белому нарисован крест. На рисунке ниже изображен крест и его линейные размеры:

размеры креста для распознавания и посадки

Таким образом на квадрокоптер была установлена нижняя веб-камера для детектирования метки креста. Как только под летающей машиной окажется центр пересечения, то он должен стабилизироваться и приземлиться. Стоит отметить тот факт, что высота полета не должна была превышать 3 метра, а со средней высоты в 1.5 метра метка целиком не видна (угол обзора стандартной веб-камеры где-то градусов 60-70). Исходя из этих простых расчетов решено было сосредоточиться именно на распознавании пересекающихся прямых. В OpenCV есть стандартная функция

cv2.HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]]) → lines

для поиска линий, однако нам показалась что данный алгоритм достаточно требовательный и точность срабатывания так себе. Поэтому решили пробовать по другому, а именно найти контур и проверить его на пригодность так:
1) бинаризовать изображение (только 2 цвета — белый и черный)

img_gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
    img_blur = cv2.blur(img_gray, (3, 3))
    img_bin = cv2.threshold(img_blur, 127, 255, cv2.THRESH_OTSU)[1]

2) выделить контуры и пройтись по каждому из них

contours, hierarchy = cv2.findContours(img_bin.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    for cnt in contours:
        approx = cv2.approxPolyDP(cnt, 0.02*cv2.arcLength(cnt,True),True)
        approx_area = cv2.contourArea(approx)

3) проверить базовые вещи контура (площадь, соотношение длины и высоты)
4) найти обрамляющий квадрат для контура и из вершин квадрата провести пересекающиеся прямые.
5) если вся наша область окажется одним цветом, то тогда считаем область искомым крестом
6) ищем и отображаем центр

В итоге получилось примерно так:

распознанная метка-крестраспознанная метка-крест для посадки КРОК
С полной программой можно ознакомиться на гитхабе. Как говорил — это моя одна из первых работ на питоне и opencv, поэтому не следует воспринимать её всерьез, однако, надеюсь что новым участникам беспилотных аппаратов КРОК этот скрипт поможет быстрее стартовать и мягко приземлить свою машину.