YoonaAI commited on
Commit
a2a65b6
·
1 Parent(s): a80c3df

Upload 2 files

Browse files
Files changed (1) hide show
  1. lib/pymaf/utils/transforms.py +78 -0
lib/pymaf/utils/transforms.py ADDED
@@ -0,0 +1,78 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # ------------------------------------------------------------------------------
2
+ # Copyright (c) Microsoft
3
+ # Licensed under the MIT License.
4
+ # Written by Bin Xiao ([email protected])
5
+ # ------------------------------------------------------------------------------
6
+
7
+ from __future__ import absolute_import
8
+ from __future__ import division
9
+ from __future__ import print_function
10
+
11
+ import cv2
12
+ import numpy as np
13
+
14
+
15
+ def transform_preds(coords, center, scale, output_size):
16
+ target_coords = np.zeros(coords.shape)
17
+ trans = get_affine_transform(center, scale, 0, output_size, inv=1)
18
+ for p in range(coords.shape[0]):
19
+ target_coords[p, 0:2] = affine_transform(coords[p, 0:2], trans)
20
+ return target_coords
21
+
22
+
23
+ def get_affine_transform(center,
24
+ scale,
25
+ rot,
26
+ output_size,
27
+ shift=np.array([0, 0], dtype=np.float32),
28
+ inv=0):
29
+ if not isinstance(scale, np.ndarray) and not isinstance(scale, list):
30
+ # print(scale)
31
+ scale = np.array([scale, scale])
32
+
33
+ scale_tmp = scale * 200.0
34
+ src_w = scale_tmp[0]
35
+ dst_w = output_size[0]
36
+ dst_h = output_size[1]
37
+
38
+ rot_rad = np.pi * rot / 180
39
+ src_dir = get_dir([0, src_w * -0.5], rot_rad)
40
+ dst_dir = np.array([0, dst_w * -0.5], np.float32)
41
+
42
+ src = np.zeros((3, 2), dtype=np.float32)
43
+ dst = np.zeros((3, 2), dtype=np.float32)
44
+ src[0, :] = center + scale_tmp * shift
45
+ src[1, :] = center + src_dir + scale_tmp * shift
46
+ dst[0, :] = [dst_w * 0.5, dst_h * 0.5]
47
+ dst[1, :] = np.array([dst_w * 0.5, dst_h * 0.5]) + dst_dir
48
+
49
+ src[2:, :] = get_3rd_point(src[0, :], src[1, :])
50
+ dst[2:, :] = get_3rd_point(dst[0, :], dst[1, :])
51
+
52
+ if inv:
53
+ trans = cv2.getAffineTransform(np.float32(dst), np.float32(src))
54
+ else:
55
+ trans = cv2.getAffineTransform(np.float32(src), np.float32(dst))
56
+
57
+ return trans
58
+
59
+
60
+ def affine_transform(pt, t):
61
+ new_pt = np.array([pt[0], pt[1], 1.]).T
62
+ new_pt = np.dot(t, new_pt)
63
+ return new_pt[:2]
64
+
65
+
66
+ def get_3rd_point(a, b):
67
+ direct = a - b
68
+ return b + np.array([-direct[1], direct[0]], dtype=np.float32)
69
+
70
+
71
+ def get_dir(src_point, rot_rad):
72
+ sn, cs = np.sin(rot_rad), np.cos(rot_rad)
73
+
74
+ src_result = [0, 0]
75
+ src_result[0] = src_point[0] * cs - src_point[1] * sn
76
+ src_result[1] = src_point[0] * sn + src_point[1] * cs
77
+
78
+ return src_result