Попытка найти алгоритм для обнаружения прямоугольников в изображениях
На данный момент я обнаружил края на изображении и планирую извлечь отрезки линий из краев, используя грубое преобразование. Как только у меня появятся сегменты, я планирую найти углы, где два сегмента пересекаются. Есть ли алгоритм, который может обнаружить прямоугольники из углов? скажем, у меня обнаружено четыре угла, возможно ли получить относительную длину сторон прямоугольника, которые составляют четыре угла, зная, что прямоугольник имеет 4 прямых угла?
Причина, по которой я хочу это сделать, заключается в том, чтобы я мог извлечь текстуру, ограниченную прямоугольником, и нарисовать ее в виде плоского прямоугольника на экране.
Изменить: Спасибо за ответы до сих пор, я думаю, что я должен объяснить свою проблему более четко, поскольку я думаю, что я был немного неправильно истолкован. Я на самом деле пытаюсь превратить искривленный прямоугольник в плоский прямоугольник. Я прочитал некоторые статьи aforge и увидел эту функцию: ссылка. Мне было интересно, можно ли определить соотношение сторон прямоугольника только по 4 углам?
3 ответа
Вы уже используете инструмент, который вам нужен - преобразование Хафа.
Стандартная формулировка преобразования Хафа используется для идентификации линий в изображении путем перевода из (x,y)
пространство изображения до (theta,d)
решение пространства возможных линий.
Вы можете сделать то же самое, чтобы идентифицировать потенциальные прямоугольники, переводя из (x,y)
пространство изображения до решения пространства возможных прямоугольников (theta,d,width,height,rotation)
,
При использовании этого подхода сохраняются сильные стороны преобразования Хафа для работы с частично видимыми объектами изображения - двухэтапный подход, использующий преобразование Хафа для идентификации ребер и комбинирование этих ребер с прямоугольниками, не сможет идентифицировать прямоугольник, если один ребро или угол достаточно затенен.
Попробуй этого брата
http://www.emgu.com/wiki/index.php/Shape_(Triangle,_Rectangle,_Circle,_Line)_Detection_in_CSharp
весело кодировать:)
Это некоторый код, который вы можете использовать для обнаружения четырехугольных фигур в изображении с помощью 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