Улучшение производительности обнаруженных объектов с помощью OpenCV

Я работаю над проектом, в котором у меня есть, чтобы обнаружить известную картинку в сцене в реальном времени в мобильном контексте (это означает, что я захватываю кадры с помощью камеры для смартфонов и изменяя размер рамки до 150x225), Сама картина может быть довольно сложной. Сейчас я обрабатываю каждый фрейм в среднем в 1.2 (используя OpenCV). Я ищу способы улучшить это время обработки и глобальную точность. Моя текущая реализация работает следующим образом:

  • Захват кадра
  • Преобразовать его в оттенки серого
  • Обнаружение ключевой точки и извлечение дескрипторов с помощью ORB
  • Сопоставьте дескриптор (2NN) (объект → сцена) и отфильтруйте их с помощью теста отношения
  • Сопоставьте дескриптор (2NN) (сцена → объект) и отфильтруйте их с помощью теста отношения
  • Несимметричное совпадение с 4 и 5.
  • Вычислить доверительное соответствие (% совпадающих ключевых точек с полными ключевыми точками)

Мой подход может быть неправильным, но результаты в порядке, хотя есть много возможностей для улучшения. Я уже заметил, что извлечение SURF происходит слишком медленно, и я не мог использовать гомографию (это может быть связано с ORB). Все предложения приветствуются!

Ответ 1

Производительность всегда связана с мобильными телефонами:)

Есть несколько вещей, которые вы можете сделать. Сравнение OpenCV: сравнение С++ и C объясняет общие методы улучшения времени обработки.

И некоторые особенности для вашего проекта:

  • Если вы создаете цветные изображения и преобразуете их в оттенки серого, это лишняя трата ресурсов. Формат встроенной камеры - YUV. Он преобразуется в RGB, что является дорогостоящим, а затем серым, что опять-таки дорого. Все это, в то время как первый канал в YUV (Y) является оттенком серого... Итак, захватите YUV и извлеките первый канал, скопировав первую часть данных изображения (YUV на Android является плоской, это означает, что первый w * h пикселей принадлежат Y-каналу)
  • ORB был создан, чтобы быть быстрым. И это. Но всего несколько недель назад FREAK был добавлен в OpenCV. Это новый дескриптор, авторы которого утверждают, что они более точные и быстрые, чем ORB/SIFT/SURF/и т.д. Дайте ему попробовать. Вы можете найти его в opencv >= 2.4.2 (сейчас это текущий)

ИЗМЕНИТЬ

Вопрос Брэда Ларсена освещает - если совпадение остается 900ms для обработки, то это проблема! Проверьте этот пост от Андрея Камаева Как работает детектор функций OpenCV ORB?, где он объясняет возможные комбинации между дескрипторами и помощниками. Попробуйте FLACH на основе uchar.

А также, я полагаю, вы получаете очень много обнаружений - сотни или тысячи - если это так много, чтобы соответствовать им. Попытайтесь ограничить обнаружение или выберите только первые n лучших значений.

Ответ 2

Вы должны попробовать FAST для обнаружения объекта в сцене, быстрее, чем SURF, и вы можете найти статьи, в которых используется пирамидальная версия FAST. Чтобы улучшить производительность на мобильных телефонах, вы можете оптимизировать циклы, использовать арифметику с фиксированной позицией и т.д. Удачи.