Compute a 2D projective transform
def ComputeProjectiveTransform2D(src, dst):
# src and dst are lists of 4 2D coordinates.
u = lambda i : src[i][0]
v = lambda i : src[i][1]
x = lambda i : dst[i][0]
y = lambda i : dst[i][1]
a = [
[u(0), v(0), 1, 0, 0, 0, -u(0) * x(0), -v(0) * x(0)],
[u(1), v(1), 1, 0, 0, 0, -u(1) * x(1), -v(1) * x(1)],
[u(2), v(2), 1, 0, 0, 0, -u(2) * x(2), -v(2) * x(2)],
[u(3), v(3), 1, 0, 0, 0, -u(3) * x(3), -v(3) * x(3)],
[0, 0, 0, u(0), v(0), 1, -u(0) * y(0), -v(0) * y(0)],
[0, 0, 0, u(1), v(1), 1, -u(1) * y(1), -v(1) * y(1)],
[0, 0, 0, u(2), v(2), 1, -u(2) * y(2), -v(2) * y(2)],
[0, 0, 0, u(3), v(3), 1, -u(3) * y(3), -v(3) * y(3)],
]
m = np.matrix(a, dtype=np.double)
rhs = np.array([x(0), x(1), x(2), x(3), y(0), y(1), y(2), y(3)],
dtype=double)
s = np.linalg.solve(m, rhs)
return np.matrix([
s[0:3],
s[3:6],
[s[6], s[7], 1]
])