#python-3.x #opencv #geometry #polygon #contour
#python-3.x #opencv #геометрия #полигон #контур
Вопрос:
У меня есть два замкнутых многоугольника, и мне нужно будет определить, имеют ли их контуры какие-то общие точки или нет. Под этим я подразумеваю не то, что у них есть общая область, а скорее то, что они разделяют часть своих контуров. Пожалуйста, смотрите изображение ниже для лучшей иллюстрации.
Два многоугольника, нарисованные на экране
Пересечение контуров зеленым цветом
Координаты:
polygon1 = [(532.35, 274.98), (525.67, 281.66), (518.4, 292.58), (507.72, 315.49), (501.22, 326.04), (497.16, 328.47), (495.53, 331.71), (488.24, 339.02), (480.94, 349.56), (476.09, 360.1), (476.89, 378.76), (492.3, 393.35), (501.22, 398.21), (527.17, 398.21), (535.28, 390.1), (540.96, 373.89), (539.64, 356.93), (541.46, 329.0), (543.39, 313.87), (545.83, 300.89), (545.83, 276.56), (543.39, 267.64), (537.81, 268.91)] polygon2 = [(482.0, 366.0), (481.0, 385.0), (486.0, 385.0), (495.0, 388.0), (495.0, 378.0), (478.0, 342.0), (467.0, 366.0)]
Я решил вычислить, перекрываются ли эти контуры, 1) взяв точки прямоугольника с минимальной площадью повернутого прямоугольника (cv2) и 2) найдя, пересекаются ли какие-либо ограничительные рамки этих объектов по следующей формуле:
def line_intersection(line1, line2): xdiff = (line1[0][0] - line1[1][0], line2[0][0] - line2[1][0]) ydiff = (line1[0][1] - line1[1][1], line2[0][1] - line2[1][1]) def det(a, b): return a[0] * b[1] - a[1] * b[0] div = det(xdiff, ydiff) if div == 0: raise Exception('lines do not intersect') d = (det(*line1), det(*line2)) x = det(d, xdiff) / div y = det(d, ydiff) / div return x, y
Однако по какой-то причине этот метод также приводит к обнаружению того, что ограничивающие рамки перекрываются, даже если контуры этого не делают (хотя они могут перекрываться по площади).
Комментарии:
1. Вы уже вычисляете пересечение каждого сегмента первого многоугольника с каждым сегментом второго многоугольника?