В прошлом году я работал над распознаванием и отслеживанием мячей, используя волейбольные видео с Youtube, и даже запустил сервис для людей, которые хотят что-то сделать со своими игровыми записями.
Недавно у меня появился дрон и первое, что я сделал, конечно, - снял нашу игру с друзьями в парке. Достаточно зависнуть на высоте 40–50 футов, чтобы охватить всю площадку, а отснятое видео дает много аналитических возможностей.
Но обо всем по порядку, и давайте проверим, как здесь работает отслеживание мяча. Дрон несет камеру с подвесом, который поглощает движения дрона.
Видео с камеры выглядит совершенно стабильно, но мой подход, основанный на удалении фона, здесь не удался:
Объясняется это тем, что стабилизация кардана не идеальна, а кадры имеют небольшие колебания, невидимые человеческому глазу. Но у компьютеров более четкое зрение, и они видят разницу. Так что фон получился довольно ярким:
Для сравнения - аналогичное статичное видео с удаленным фоном выглядит так:
Так что нам ничего не остается, как искать новые пути. К счастью, OpenCV - старая и богатая библиотека, в которой нужно проверить множество алгоритмов.
Раньше у меня был опыт работы с Canny edge для поиска объектов по их контурам.
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) gray = cv.GaussianBlur(gray, (5, 5),0) mask = cv.Canny(gray, 50, 100)
Применение этого алгоритма к видео с дрона дает многообещающие результаты:
Как видно, мяч распознается и отслеживается. Интересно, что Canny дает худшие (чем удаление фона) результаты на действительно статичных видео, поэтому мы не можем использовать его везде. Это можно объяснить тем, что Кэнни распознает множество фоновых объектов, и мяч может потеряться при полете.
Затем удалите фон на изображении с фильтром Canny:
mask = backSub.apply(frame) mask = cv.dilate(mask, None) mask = cv.GaussianBlur(mask, (15, 15),0) ret,mask = cv.threshold(mask,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)
Выглядит лучше:
Трек подачи теперь довольно точен: