--- /dev/null
+import numpy as np\r
+import cv2\r
+\r
+def to_list(a):\r
+ return [tuple(p) for p in a]\r
+\r
+def anorm2(a):\r
+ return (a*a).sum(-1)\r
+def anorm(a):\r
+ return np.sqrt( anorm2(a) )\r
+\r
+def homotrans(H, x, y):\r
+ xs = H[0, 0]*x + H[0, 1]*y + H[0, 2]\r
+ ys = H[1, 0]*x + H[1, 1]*y + H[1, 2]\r
+ s = H[2, 0]*x + H[2, 1]*y + H[2, 2]\r
+ return xs/s, ys/s\r
+\r
+def to_rect(a):\r
+ a = np.ravel(a)\r
+ if len(a) == 2:\r
+ a = (0, 0, a[0], a[1])\r
+ return np.array(a, np.float64).reshape(2, 2)\r
+\r
+def rect2rect_mtx(src, dst):\r
+ src, dst = to_rect(src), to_rect(dst)\r
+ cx, cy = (dst[1] - dst[0]) / (src[1] - src[0])\r
+ tx, ty = dst[0] - src[0] * (cx, cy)\r
+ M = np.float64([[ cx, 0, tx],\r
+ [ 0, cy, ty],\r
+ [ 0, 0, 1]])\r
+ return M\r
+\r
+\r
+def lookat(eye, target, up = (0, 0, 1)):\r
+ fwd = np.asarray(target, np.float64) - eye\r
+ fwd /= anorm(fwd)\r
+ right = np.cross(fwd, up)\r
+ right /= anorm(right)\r
+ down = np.cross(fwd, right)\r
+ Rt = np.zeros((3, 4))\r
+ Rt[:,:3] = [right, down, fwd]\r
+ Rt[:,3] = -np.dot(Rt[:,:3], eye)\r
+ return Rt\r
+\r
+def mtx2rvec(R):\r
+ pass\r
+ \r
+\r
+if __name__ == '__main__':\r
+ import cv2\r
+ from time import clock\r
+\r
+ '''\r
+ w, h = 640, 480\r
+ while True:\r
+ img = np.zeros((h, w, 3), np.uint8)\r
+ t = clock()\r
+ eye = [5*cos(t), 5*sin(t), 3]\r
+ Rt = lookat(eye, [0, 0, 0])\r
+ '''\r
+\r
+\r
+\r
+ eye = [1, -4, 3]\r
+ target = [0, 0, 0]\r
+ Rt = lookat(eye, [0, 0, 0])\r
+ print Rt\r
+ p = [0, 0, 0]\r
+ print cv2.transform(np.float64([[p]]), Rt)\r
+\r
+ print cv2.SVDecomp(Rt[:,:3])\r
+\r