Skip to content

Instantly share code, notes, and snippets.

@flashlib
Last active July 23, 2023 17:19
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save flashlib/e8261539915426866ae910d55a3f9959 to your computer and use it in GitHub Desktop.
Save flashlib/e8261539915426866ae910d55a3f9959 to your computer and use it in GitHub Desktop.
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("")
@chamecall
Copy link

Why you call it clockwise order while it's counter clockwise as it can be seen in your example?

@brodeau
Copy link

brodeau commented Sep 26, 2022

As of today, it is clockwise !
Cheers for this function!

@DanielAsefa
Copy link

thanks so much

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment