Поиск цветной рамки на изображении по цвету. Как учесть изменение цвета при разных углах наклона?

Всех приветствую!

Начал изучать компьютерное зрение, использую 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 - найти все углы на исходном изображении. затем прогнать поиск рамки, определить наибольшую закрашенную область (вероятный кандидат на рамку), затем перебрав все углы найти уравнения прямых составляющих нашу рамку.

Буду рад любым советам, если что то непонятно или требуются уточнения задачи отпишусь по ходу обсуждения.
Заранее всем спасибо!
c61b954e380b4f72b0125aa277320cb2.pngd0a90c07a886463a844207ed86b7907e.png
  • Вопрос задан
  • 1369 просмотров
Решения вопроса 1
@Eddy_Em
А если вот как попробовать: вычислить лапласиан гауссианы по цветовому тону в HSV, а затем пороговой обработкой бинаризовать поля с близким к нулю лапласианом?
В этом случае плавные изменения цвета (из-за неравномерной освещенности) должны уйти, а резкие (границы) — остаться.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы