Всех приветствую!
Начал изучать компьютерное зрение, использую C# и EMGUCV.
Взяв за основу пример с сайта, я пытаюсь отслеживать цветную рамку в видеопотоке с вебкамеры ноута и, определив плоскость изображения, нарисовать нормаль к рамке.
(Пример:
www.emgu.com/wiki/index.php/Shape_(Triangle,_Rectangle,_Circle,_Line)_Detection_in_CSharp)
Проблма: если крутить рамку, то при определенных углах наклона он перестает отслеживаться так как камера начинает воспринимать её цвет иначе.
Уточнение эксперимента:
Я пытаюсь найти квадрат вложенный в другой квадрат. Вырезал квадратик из цветной бумаги, прорезал в центре квадратик поменьше и наклеил это всё на альбомный листа а4, камера видит только лист (никаких помех на заднем фоне следовательно нет).
Логика работы программы такая:
- Получили BGR кадр
- перевели в HSV
- функцией inRange(h,s,v) настроили интересующий нас цвет
- dilate и erode для удаления шумов на полученном бинарном изображении
- получили контуры с помощью canny
- отфильтровал из списка контуров незамкнутые и со слишком малой площадью
- преобразование хафа для линий
- нарисовали найденные линии на исходной изображении.
(Пока что не написал) - по списку линий найти два вложенных квадрата, высчитать координаты двух векторов, найти третий вектор, нарисовать всё на экране.
На первом изображении вы можете видеть что в целом все работает нормально - найденный контур нарисован зеленым на исходной картинке с вебки(верхняя левая). На нижней левой картинке (показывает результат hsv преобразования и морфологических операций) видно что рамка в целом видна хорошо, помех почти нет. Видео вставить нет возможности, но во время работы на рамке периодически возникают маленькие помехи не более 1/10 от толщины рамки.
На втором изображении показан момент отказа - лист наклонен настолько, что рамка больше не определяется. Насколько я разобрался, причина такая - камера видит цвет по другому-> цвет отсекается inRange -> dilate и erode вырезают слишком большую часть -> контур повреждается и отсекается по условию замкнутости (см.выше)
Вопрос простой - что делать? Каким подходом исправить ситуацию или же как именно доработать мой метод если он ошибочен ( и в чем ошибка) ?
Дополнительный вопрос - существует ли метод adaptivethreshold для цветных изображений? гугленье не дало ничего внятного.
В целом я нашел несколько намеков как можно было бы исправить ситуацию:
1 - морфологическими преобразованиями с самодельным ядром необходимо выравнивать контур внутри рамки. Для углов использовать другое ядро. Не понимаю как сделать это так, чтобы работало и при вращении рамки, ведь для линии уже не столь просто задать ядро, а если ещё и наклонить то вообще работаем с ромбом.
2 - если найти гистограмму рамки, то растянув её можно в теории доработать метод inRange. Как именно - мне непонятно. Так же с помощью гистограммы в теории можно искать саму рамку на изображении. Но как тогда найти данные по которым строить гистограмму?
3 - найти feature point.
4 - найти все углы на исходном изображении. затем прогнать поиск рамки, определить наибольшую закрашенную область (вероятный кандидат на рамку), затем перебрав все углы найти уравнения прямых составляющих нашу рамку.
Буду рад любым советам, если что то непонятно или требуются уточнения задачи отпишусь по ходу обсуждения.
Заранее всем спасибо!