2014-10-20 3 views
2

Учитывая два прямоугольника, и мы знаем положение четырех углов, ширины, высоты, углы. Как вычислить коэффициент перекрытия этих двух прямоугольников? Не могли бы вы помочь мне?Как вычислить коэффициент перекрытия двух повернутых прямоугольников?

+0

Я не знаю OpenCV много, но вы можете нарисовать и наложить их в 2 разных цвета, сказать красный и синий, а затем рассчитать количество фиолетовых пикселей? –

+0

@Mark Setchell, вы можете, но это решение может быть чрезвычайно дорогостоящим. Возможно, вам придется отображать и подсчитывать миллионы пикселей. Также это уменьшит точность результата. –

ответ

2

Удобный способ заключается в использовании алгоритма обрезки полигона Sutherland-Hodgman. Он работает, обрезая один из полигонов четырьмя опорными линиями (полуплоскостями) другого. В конце вы получаете пересекающийся многоугольник (в худшем случае восьмиугольник) и находите его площадь по формуле polygon area.

enter image description here

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

Отметим, что этот подход легко обобщается на два общих выпуклых многоугольника, принимая операции O (N.M). G.T. Toussaint, используя принцип вращающегося суппорта, уменьшил рабочую нагрузку до O (N + M) и B. Chazelle & Д. П. Добкин показал, что в операциях O (Log (N + M)) можно обнаружить непустое пересечение. Это показывает, что, вероятно, есть немного возможностей для улучшения подхода обрезки S-H, хотя N = M = 4 является крошечной проблемой.

+0

+1, но вы должны упомянуть, что поворот обоих прямоугольников должен выполняться в одной точке. Если это не то же самое (например, каждый из них повернут вокруг своего собственного центра), чем ответ будет неправильным. Это очень распространенная ошибка. –

+0

Чтобы понравиться @ Майкл Бурдинов, я добавил, что поворот будет происходить вокруг начала координат, что делает формулу вращения самой простой. –

1

Допустим, у вас есть прямоугольник А и В можно использовать операцию:

intersection_area = (A & B).area(); 

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

+1

^^ Хехе, имел ту же идею, но не так для ** RotatedRect ** – berak

+1

в этом случае и так как мы знаем точки каждого прямоугольника. Нарисуйте каждый в другом мате с тем же размером исходного изображения. Затем выполните оператор AND и подсчитайте пиксели без нуля. Это даст вам количество пикселей, разделяющих обе формы –

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

  • Нет связанных вопросов^_^