Как обнаружить четырехугольник на изображении в Java?

Я хочу обнаружить четырехугольник на изображении в Java. Я могу использовать метод HoughLinesP в OpenCV (используя javaCV для привязки opencv java) для обнаружения сегментов линий. Но я не могу понять, как определить четырехугольную форму - есть ли другой метод для этого или какой-то способ использовать линии hough? Кроме того, после обнаружения углов четырехугольника я хочу, чтобы он возвращал прямоугольник, как это делает этот класс - http://www.aforgenet.com/framework/docs/html/7039a71d-a87d-47ef-7907-ad873118e374.htm — есть ли эквивалентная библиотека в открытьрезюме?


person abhishek    schedule 24.10.2012    source источник


Ответы (3)


Как выглядят ваши входные изображения? Если вы обнаружите много отрезков с помощью преобразования Хафа, вы можете попробовать использовать RANSAC для создания число гипотез четырехугольной формы, найти способ оценить их пригодность и вернуть лучшую гипотезу.

Одна гипотеза может быть сгенерирована следующим образом:

  • выбрать четыре случайных сегмента линии из обнаруженного набора сегментов линии
  • найдите четыре угла, ища пересечения линий, на которых лежат выбранные отрезки
  • оцените пригодность четырехугольника, определяемого этими четырьмя точками

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

Это просто идея, я еще не пробовал использовать этот подход (но я планирую реализовать что-то подобное). Дайте мне знать, если вы думаете, что это может сработать, или почему это не сработает! :)

person ppalasek    schedule 27.10.2012

Ваш алгоритм может быть примерно таким

  1. Обработайте изображение, чтобы найти края (фильтр Кэнни)
  2. Примените преобразование Хафа, чтобы найти линии
  3. Обнаружение пар линий, которые пересекаются под углом 90 градусов (приблизительно)
person jose    schedule 24.10.2012
comment
Да, я уже знал об этом, но искал более оптимальный алгоритм или существующий метод, который дает четырехугольные углы. Кроме того, четырехугольное преобразование необходимо выполнить после извлечения угла. - person abhishek; 24.10.2012
comment
Если линии являются результатом перспективной проекции четырехугольника в 3D на 2D-поверхность, то нет гарантии, что углы между соседними ребрами будут равны 90 градусам. Однако, имея набор из четырех линий, вы все равно можете выполнить какую-то оценку вероятности того, что это спроецированный четырехугольник - в таком случае это немного сложнее. - person Drew Noakes; 19.12.2012

Если вы используете библиотеку OpenCV, вам обязательно стоит попробовать функцию FindChessboardCorners. А также хорошее руководство.

person ArtemStorozhuk    schedule 24.10.2012
comment
Не уверен, что это применимо в моем случае. - person abhishek; 24.10.2012
comment
он обнаруживает на изображении шахматную доску, чего здесь нет. Не будет ли это ошибкой, поскольку четырехугольник на моем изображении не имеет внутренних углов/квадратов? - person abhishek; 24.10.2012
comment
Извините, я не знаю ответа на ваш вопрос, так как никогда не занимался калибровкой. В любом случае, вы хотите, чтобы я проверил это для вас? - person ArtemStorozhuk; 24.10.2012