Найти искаженный прямоугольник на изображении (OpenCV) - PullRequest
9 голосов
/ 15 июня 2011

Я ищу правильный набор алгоритмов для решения этой проблемы обработки изображений:

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

Я могу рассчитать контур, используя OpenCV, но поскольку изображение искажено, оно часто будет содержать более 4 угловых точек. Существует ли хороший алгоритм аппроксимации (предпочтительно с использованием операций OpenCV) для нахождения угловых точек прямоугольника с использованием двоичного изображения или описания контура?

Изображение выглядит так:

enter image description here

Спасибо!

Денис

Ответы [ 6 ]

6 голосов
/ 15 июня 2011

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

2 голосов
/ 18 июня 2011
1 голос
/ 15 июня 2011

Попробуйте Харрис Корнер Детектор.В пакете OpenCV есть пример.Вам нужно поиграть с параметрами для вашего изображения.

И посмотреть другие алгоритмы OpenCV: http://www.comp.leeds.ac.uk/vision/opencv/opencvref_cv.html#cv_imgproc_features

1 голос
/ 15 июня 2011

Посмотрите на функцию opencv ApproxPoly. Аппроксимирует многоугольник из контура.

0 голосов
/ 26 июня 2014
  1. Это будет работать, даже если вы начнете с каких-то дефектов, то есть ваш звонок приблизительно вернет пент / шестиугольники.Он уменьшит любой контур, например, transContours, до четырехугольника или любого другого поли, который вы пожелаете.
  2. vector<Point> cardPoly;// Quad storage
    int PolyLines = 0;//PolyPoly counter ;)
    double simplicity = 0.5;//Increment of adjustment, lower numbers may be more precise vs. high numbers being faster to cycle.
    while(PolyLines != 4)//Adjust this 
    {
        approxPolyDP(transContours, Poly, simplicity, true);
        PolyLines = Poly.size();
        simplicity += 0.5;
    }
    
0 голосов
/ 15 июня 2011

Я бы попробовал обобщенное преобразование Хафа, оно немного медленное, но хорошо справляется с искаженными / неполными формами.

http://en.wikipedia.org/wiki/Hough_transform

...