flashlib
3/27/2018 - 10:44 AM

Ordering coordinates clockwise with Python and OpenCV

Ordering coordinates clockwise with Python and OpenCV

from imutils import perspective
import numpy as np

def order_points_new(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

    # if use Euclidean distance, it will run in error when the object
    # is trapezoid. So we should use the same simple y-coordinates order method.

    # now, sort the right-most coordinates according to their
    # y-coordinates so we can grab the top-right and bottom-right
    # points, respectively
    rightMost = rightMost[np.argsort(rightMost[:, 1]), :]
    (tr, br) = rightMost

    # return the coordinates in top-left, top-right,
    # bottom-right, and bottom-left order
    return np.array([tl, tr, br, bl], dtype="float32")

pts = np.array([[10,10],
               [10,20],
               [20,20],
               [30,10]])
ordered_old = perspective.order_points(pts)
ordered_new = order_points_new(pts)

print("raw points")
print(pts.astype("int"))
print("ordered by Euclidean distance")
print(ordered_old.astype("int"))
print("orderd by y-coordinates")
print(ordered_new.astype("int"))
print("")