2013-08-23 3 views
2

У меня есть объект, и я бы хотел определить его точный центр. Используя OpenCV, я обнаруживаю края с Canny, а затем я выполняю HoughLinesP для обнаружения линий: see this.Обнаружение точной центральной точки прямоугольного объекта с использованием HoughLinesP

Я использую преобразование Hough, потому что объект не является полностью прямоугольным, а иногда обнаруживаются удары here.

Линии определены в структуре. Я также вычислить среднюю точку, угол и длину:

struct hLine { 
    Point pStart, pEnd, pMidpoint; 
    float angle; 
    int length; 
}; 

Как вы можете видеть, что есть несколько линий, обнаруженных по бокам.

Вопрос: Как получить самую длинную линию для каждой стороны прямоугольника (0, 1, 3, 4 в данном случае)?

подход я попытался было вычислить уравнение линии у = кх + п, а затем отсортировать строки от угла, длины и п и держать только те строки, которые имеют п разделены на некоторое число (противоположные стороны прямоугольника). У меня проблема с вертикальными линиями (n не может быть рассчитана), а также когда объект почти вертикальный n номер большой, поэтому строка не удаляется.

Следующий шаг - рассчитать пересечения линий, а затем рассчитать центр. Идея основана на этом уроке: opencv-code.com/tutorials/automatic-perspective-correction-for-quadrilateral-objects/

Кроме того, если кто-то имеет лучшее решение для обнаружения точного центральной точки, пожалуйста, говорить :)

ответ

0

Я хотел бы сделать:

  • Вычислить OBB (ориентированный ограничивающий прямоугольник) данных, в первую очередь.
  • Создайте четыре ограничивающих прямоугольника по краям OBB с шириной определенной предопределенной точности.
  • Отбросьте все точки, которые находятся в одном из четырех ограничивающих прямоугольников.
  • Сделайте четыре крайних ограничивающих прямоугольника для краев (отбросьте удары, здесь)
  • Создайте прямоугольник из центральных линий четырех ограничивающих прямоугольников.
  • Рассчитать центр прямоугольника.
+0

Я действительно не понимаю третью и четвертую операцию. Какие моменты я должен отбросить? –

+0

@SimonG. Третий - это угловые точки, четвертый - это точки, которые удалены/удары (ваш термин) (отрицательное влияние на минимальную границу края) –

0

Я хотел бы сделать это следующим образом:

  1. использование Хаф трансформирует для вычисления уравнения линии. Не должно быть проблем с вертикальными/горизонтальными линиями, если вы параметризуете линию своим нормальным вектором;
  2. затем получить 4 угла прямоугольника, вычислив пересечения линий;
  3. Наконец, получите центр, вычислив уравнения диагональных линий прямоугольника, а затем ищите их пересечение.

Этапы 1 и 2 уже выполнены в ссылке, которую вы передаете кстати.

Что делать, если обнаружение линии Hough недостаточно прочное?

В этом случае я бы пошел с одним очень надежным алгоритмом обнаружения под названием meaningful alignments, предложенным А. Десольне. Математика за ним может выглядеть немного страшно сначала, но алгоритм по-прежнему очень прост в реализации (может быть, немного медленнее). Я использовал его в прошлом, и результаты действительно так же хороши, как утверждает автор.

+0

Вы имели в виду стандартное или probalistic Hough transform? Я попытался со стандартным преобразованием, но у меня появилось много неправильных строк, особенно для более коротких сторон прямоугольника. Используя пробное преобразование, я получаю проблему, описанную в моем вопросе. –

+0

Я предлагаю вам другой метод обнаружения линии, который действительно надежный. См. Ссылку в ответе. – sansuiso

1

После использования canny для обнаружения краев вы можете использовать морфологическую операцию закрытия для соединения краев. Затем найдите контуры и сгладьте контуры, используя полигональное приближение. Для каждого четырехугольника, который вы обнаружите, вы можете проверить, являются ли углы примерно на 90 градусов, чтобы убедиться, что это прямоугольник. Согласно вашему образцу, самым большим прямоугольником, который вы обнаруживаете, должен быть интересующий вас прямоугольник (вы также можете найти выпуклую оболочку каждого контура, а затем применить приближение многоугольника к выпуклой оболочке).

+0

Я реализовал это, но многоугольное приближение ('cv :: approxPolyDP') создает странную форму. Это с epsilon = 5: http://snag.gy/kV2uu.jpg, epsilon = 2: http://snag.gy/7PtuP.jpg, что лучше, но также включает удар с нижней стороны. –

+0

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

+0

Посмотрите на образец opentsv.cpp opencv. он использует аналогичный подход – dhanushka

Смежные вопросы