Найти искаженный прямоугольник на изображении (OpenCV)

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

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

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

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

введите здесь описание изображения

Спасибо!

Деннис


person Dennis Kempin    schedule 15.06.2011    source источник
comment
Как всегда с такими вопросами, образцы изображений были бы очень полезны.   -  person etarion    schedule 15.06.2011
comment
Я добавил изображение, надеюсь, это поможет найти решение.   -  person Dennis Kempin    schedule 15.06.2011


Ответы (6)


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

person Andrey Sboev    schedule 15.06.2011

немного другой ответ, см.

http://opencv.willowgarage.com/documentation/cpp/camera_dication_and_3d_reconstruction.html

person plan9assembler    schedule 18.06.2011
comment
неработающая ссылка :( (неудивительно после 8 лет... :) ) - person jtlz2; 04.07.2019

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

person Sammy    schedule 15.06.2011

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

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

person red1ynx    schedule 15.06.2011

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

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

person Marek    schedule 15.06.2011

  1. Это будет работать, даже если вы начнете с некоторыми дефектами, т.е. ваш вызов procPolly возвращает pent/шестиугольники. Он уменьшит любой контур, например, 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;
    }
    
person Jash McCunn    schedule 26.06.2014