四边形坐标顺时针排序

1. 做图像检测的时候处理数据经常遇到给出矩形的四个坐标点,要求找出左上角坐标并对乱序的坐标按顺时针或者逆时针进行排序。Its extremely important to maintain a consistent ordering of points !

注意,这个方法仅适用于凸多边形。

from scipy.spatial import distance as dist

import numpy as np

import math



def cos_dist(a, b):

if len(a) != len(b):

return None

part_up = 0.0

a_sq = 0.0

b_sq = 0.0

print a, b

print zip(a, b)

for a1, b1 in zip(a, b):

part_up += a1*b1

a_sq += a1**2

b_sq += b1**2

part_down = math.sqrt(a_sq*b_sq)

if part_down == 0.0:

return None

else:

return part_up / part_down



# this function is confined to rectangle

def order_points(pts):

# sort the points based on their x-coordinates

xSorted = pts[np.argsort(pts[:, 0]), :]


# grab the left-most and right-most points from the sorted

# x-roodinate points

leftMost = xSorted[:2, :]

rightMost = xSorted[2:, :]


# now, sort the left-most coordinates according to their

# y-coordinates so we can grab the top-left and bottom-left

# points, respectively

leftMost = leftMost[np.argsort(leftMost[:, 1]), :]

(tl, bl) = leftMost


# now that we have the top-left coordinate, use it as an

# anchor to calculate the Euclidean distance between the

# top-left and right-most points; by the Pythagorean

# theorem, the point with the largest distance will be

# our bottom-right point

D = dist.cdist(tl[np.newaxis], rightMost, "euclidean")[0]

(br, tr) = rightMost[np.argsort(D)[::-1], :]


# return the coordinates in top-left, top-right,

# bottom-right, and bottom-left order

return np.array([tl, tr, br, bl], dtype="float32")



def order_points_quadrangle(pts):

# sort the points based on their x-coordinates

xSorted = pts[np.argsort(pts[:, 0]), :]


# grab the left-most and right-most points from the sorted

# x-roodinate points

leftMost = xSorted[:2, :]

rightMost = xSorted[2:, :]


# now, sort the left-most coordinates according to their

# y-coordinates so we can grab the top-left and bottom-left

# points, respectively

leftMost = leftMost[np.argsort(leftMost[:, 1]), :]

(tl, bl) = leftMost


# now that we have the top-left and bottom-left coordinate, use it as an

# base vector to calculate the angles between the other two vectors


vector_0 = np.array(bl-tl)

vector_1 = np.array(rightMost[0]-tl)

vector_2 = np.array(rightMost[1]-tl)


angle = [np.arccos(cos_dist(vector_0, vector_1)), np.arccos(cos_dist(vector_0, vector_2))]

(br, tr) = rightMost[np.argsort(angle), :]


# return the coordinates in top-left, top-right,

# bottom-right, and bottom-left order

return np.array([tl, tr, br, bl], dtype="float32")

参考:

http://www.pyimagesearch.com/2016/03/21/ordering-coordinates-clockwise-with-python-and-opencv/

https://www.coder4.com/archives/3826

猜你喜欢

转载自blog.csdn.net/dou3516/article/details/111941494