Попытка найти алгоритм для обнаружения прямоугольников на изображениях - PullRequest
3 голосов
/ 26 октября 2011

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

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

Редактировать: Спасибо за ответы, пока,Я думаю, что я должен объяснить свою проблему более ясно, поскольку я думаю, что меня немного неправильно интерпретировали.Я на самом деле пытаюсь превратить искривленный прямоугольник в плоский прямоугольник.Я прочитал некоторые статьи aforge и увидел эту функцию: ссылка .Мне было интересно, можно ли определить соотношение сторон прямоугольника только по 4 углам?

Ответы [ 3 ]

3 голосов
/ 26 октября 2011

Вы уже используете нужный вам инструмент - преобразование Хафа .

Стандартная формулировка преобразования Хафа используется для идентификации линий в изображении путем перевода из (x,y) пространство изображения до (theta,d) пространства возможных решений.

Вы можете сделать то же самое, чтобы идентифицировать подходящие прямоугольники, переводя из (x,y) пространства изображения в пространство возможных решений.прямоугольники (theta,d,width,height,rotation).

При таком подходе сохраняются сильные стороны преобразования Хафа для работы с частично видимыми объектами изображения - двухэтапный подход, использующий преобразование Хафа для определения ребер и объединения этих ребер в прямоугольники, не сможет определить прямоугольник, если один край или угол достаточно затенены.

0 голосов
/ 18 ноября 2011

попробуй этого брата:

http://www.emgu.com/wiki/index.php/Shape_(Triangle,_Rectangle,_Circle,_Line)_Detection_in_CSharp

весело кодируй:)

0 голосов
/ 26 октября 2011

Это некоторый код, который вы можете использовать для обнаружения четырехугольных фигур на изображении с помощью AForge.NET Framework:

// get angles between 2 pairs of opposite sides
float angleBetween1stPair = Tools.GetAngleBetweenLines(corners[0], corners[1], corners[2], corners[3]);
float angleBetween2ndPair = Tools.GetAngleBetweenLines(corners[1], corners[2], corners[3], corners[0]);

// check 1st pair for parallelism
if (angleBetween1stPair <= angleError)
{
    subType = PolygonSubType.Trapezoid;

    // check 2nd pair for parallelism
    if (angleBetween2ndPair <= angleError)
    {
        subType = PolygonSubType.Parallelogram;

        // check angle between adjacent sides
        if (Math.Abs(Tools.GetAngleBetweenVectors(corners[1], corners[0], corners[2]) - 90) <= angleError)
            subType = PolygonSubType.Rectangle;

        //get length of 2 adjacent sides
        float side1Length = (float)corners[0].DistanceTo( corners[1] );
        float side2Length = (float)corners[0].DistanceTo( corners[3] );

        if (Math.Abs(side1Length - side2Length) <= maxLengthDiff)
            subType = (subType == PolygonSubType.Parallelogram) ? PolygonSubType.Rhombus : PolygonSubType.Square;
    }
}
else
{
    // check 2nd pair for parallelism - last chence to detect trapezoid
    if (angleBetween2ndPair <= angleError)
    {
        subType = PolygonSubType.Trapezoid;
    }
}

В этой статье приведены примеры того, как обнаруживать различные формы:
http://www.aforgenet.com/articles/shape_checker/

Вот ссылка для загрузки AForge.NET Framework:
http://www.aforgenet.com/framework/downloads.html

...