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

Я пытаюсь обнаружить фигуру (крест) в потоке входного видео с помощью OpenCV. В настоящее время я имею порог, чтобы получить бинарный образ моего креста, который работает очень хорошо. К сожалению, мой алгоритм, чтобы решить, является ли извлеченный blob крест или нет, не работает очень хорошо. Как вы можете видеть на изображении ниже, не все углы обнаруживаются под определенными перспективами.

Enter image description here

Я использую findContours() и approxPolyDP(), чтобы получить приближение моего контура. Если я обнаруживаю 12 углов/вершин в этой аппроксимированной кривой, blob считается крестом.

Есть ли лучший способ решить эту проблему? Я думал о SIFT, но алгоритм должен выполняться в режиме реального времени, и я читал, что SIFT не подходит для реального времени.

+40
30 янв. '13 в 19:33
источник поделиться
2 ответа

У меня есть несколько предложений, которые могут дать некоторые интересные результаты, хотя я тоже не уверен.

Если крест всегда находится рядом с центром вашего изображения и всегда лежит на плоской поверхности, вы можете попытаться найти гомографию между камерой и плоскостью, на которой лежит крест. Это позволило бы вам преобразовать образец изображения креста (при выборе различных в плоских вращениях) в систему координат визуализированного креста. Затем вы можете создавать шаблоны, которые вы могли бы сопоставить с изображением. Вы можете сделать несколько простых тестов для согласования пикселей, чтобы определить, есть ли у вас совпадение.

В качестве альтернативы вы можете попытаться обучить классификатор, основанный на Хааре, чтобы распознать крест. Этот тип классификатора часто используется при распознавании лиц и обнаруживает ориентированные ребра в изображениях, классифицируя грани по относительным положениям нескольких ориентированных ребер. Он имеет хорошую точность классификации на лицах и очень быстро. Хотя я не могу ручаться за его точность в этой конкретной ситуации, он может дать некоторые хорошие результаты для простых фигур, таких как крест.

+9
30 янв. '13 в 20:17
источник

Вычисление выпуклого корпуса, а затем использование дефектов выпуклости может работать.

Все кресты должны иметь четыре дефекта выпуклости, составляющие четыре набора из двух точек или четыре вектора. Кроме того, если ваша фигура была крестиком, то эти четыре вектора будут иметь две пары дополнительных углов.

+8
02 февр. '13 в 9:29
источник

Посмотрите другие вопросы по меткам или Задайте вопрос