Skip to content

Instantly share code, notes, and snippets.

@flashlib
Last active July 23, 2023 17:19

Revisions

  1. flashlib renamed this gist Mar 27, 2018. 1 changed file with 0 additions and 0 deletions.
    File renamed without changes.
  2. flashlib created this gist Mar 27, 2018.
    45 changes: 45 additions & 0 deletions order_coordinates
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,45 @@
    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("")