Обнаружение кривых в OpenCV - PullRequest
       17

Обнаружение кривых в OpenCV

5 голосов
/ 24 ноября 2011

Я только начинаю использовать OpenCV для обнаружения определенных кривых на изображении. Во-первых, я хочу проверить, существует ли кривая, а затем я бы хотел определить тип кривой по вертикальной или горизонтальной выпуклой или вогнутой кривой. Есть ли доступная функция в OpenCV? Если нет, можете ли вы дать мне несколько идей о том, как я могу написать такую ​​функцию? Спасибо! Кстати, я использую C ++.

1 Ответ

6 голосов
/ 19 апреля 2012

Сопоставление с шаблоном не является надежным способом решения этой проблемы (это как смотреть на объект из маленького отверстия), и детекторы краев не обязательно возвращают вам истинные края изображения;ложные края, например, из-за теней, тоже возвращаются.Кроме того, вам приходится иметь дело с проблемой неполных краев и другими проблемами, которые увеличиваются со сложностью сцены в вашем изображении.

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

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

Например, предположим, вы пытаетесь обнаружить кривую следующего вида f (x) = ax ^2 + bx + c.RANSAC будет в основном пытаться найти среди точек на обнаруженных ребрах, подмножество которых лучше всего подходит для этой кривой.Чтобы обнаружить разные кривые, измените f (x) соответственно и запустите RANSAC для каждой из них.Затем вы можете попытаться определить, действительно ли кривая, представленная символом f (x), существует на вашем изображении, используя некоторую эвристику, примененную к точкам, которые были назначены ей RANSAC (например, если слишком мало точек было подобрано к модели, вероятно, чтоКривая не существует. Но как определить хороший порог для количества точек?).Ваша модель станет более сложной, когда вам придется учитывать допустимые преобразования, такие как вращение и т. Д.

Проблема с этим подходом заключается в том, что вы в основном пытаетесь подогнать то, что, как вы думаете, должно быть на изображении, к точкам, а иногда,даже если то, что вы ищете, отсутствует, оно вернет вам «наилучшую возможную» форму.Например, у вас есть целая куча точек, обнаруженных по концентрическому кругу.Если вы попытаетесь определить прямые линии из этих точек, RANSAC вернет вам наиболее подходящую линию!Фактически, он может дать вам много разных строк из разных прогонов в зависимости от того, какие точки он выбрал на этапе случайной инициализации.

Для получения более подробной информации о том, как использовать RANSAC в такого рода проблемах, посмотрите на RANSAC для чайников от Марко Зулиани .У него также есть замечательный набор инструментов MATLAB , сопровождающий этот технический отчет, который вы, вероятно, можете перенести на язык по вашему выбору.

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

...