diff options
Diffstat (limited to 'megapixels/app/processors/face_pose.py')
| -rw-r--r-- | megapixels/app/processors/face_pose.py | 42 |
1 files changed, 25 insertions, 17 deletions
diff --git a/megapixels/app/processors/face_pose.py b/megapixels/app/processors/face_pose.py index f2548b32..96281637 100644 --- a/megapixels/app/processors/face_pose.py +++ b/megapixels/app/processors/face_pose.py @@ -18,12 +18,13 @@ class FacePoseDLIB: dnn_size = (400, 400) + pose_types = {'pitch': (0,0,255), 'roll': (255,0,0), 'yaw': (0,255,0)} def __init__(self): pass - def pose(self, landmarks, dim, project_points=False): + def pose(self, landmarks, dim): # computes pose using 6 / 68 points from dlib face landmarks # based on learnopencv.com and # https://github.com/jerryhouuu/Face-Yaw-Roll-Pitch-from-Pose-Estimation-using-OpenCV/ @@ -68,12 +69,17 @@ class FacePoseDLIB: result = {} # project points - if project_points: - pts_im, jac = cv.projectPoints(axis, rot_vec, tran_vec, cam_mat, dist_coeffs) - pts_model, jac2 = cv.projectPoints(model_points, rot_vec, tran_vec, cam_mat, dist_coeffs) - result['points_model'] = pts_model - result['points_image'] = pts_im - result['point_nose'] = tuple(landmarks[pose_points_idx[0]]) + #if project_points: + pts_im, jac = cv.projectPoints(axis, rot_vec, tran_vec, cam_mat, dist_coeffs) + pts_model, jac2 = cv.projectPoints(model_points, rot_vec, tran_vec, cam_mat, dist_coeffs) + #result['points_model'] = pts_model + #result['points_image'] = pts_im + result['points'] = { + 'pitch': pts_im[0], + 'roll': pts_im[2], + 'yaw': pts_im[1] + } + result['point_nose'] = tuple(landmarks[pose_points_idx[0]]) rvec_matrix = cv.Rodrigues(rot_vec)[0] @@ -84,21 +90,23 @@ class FacePoseDLIB: pitch = math.degrees(math.asin(math.sin(pitch))) roll = -math.degrees(math.asin(math.sin(roll))) yaw = math.degrees(math.asin(math.sin(yaw))) - degrees = {'pitch': pitch, 'roll': roll, 'yaw': yaw} - result['degrees'] = degrees + result['pitch'] = pitch + result['roll'] = roll + result['yaw'] = yaw return result - def draw_pose(self, im, pts_im, pts_model, pt_nose): - cv.line(im, pt_nose, tuple(pts_im[1].ravel()), (0,255,0), 3) #GREEN - cv.line(im, pt_nose, tuple(pts_im[0].ravel()), (255,0,), 3) #BLUE - cv.line(im, pt_nose, tuple(pts_im[2].ravel()), (0,0,255), 3) #RED + def draw_pose(self, im, pt_nose, image_pts): + cv.line(im, pt_nose, tuple(image_pts['pitch'].ravel()), self.pose_types['pitch'], 3) + cv.line(im, pt_nose, tuple(image_pts['yaw'].ravel()), self.pose_types['yaw'], 3) + cv.line(im, pt_nose, tuple(image_pts['roll'].ravel()), self.pose_types['roll'], 3) - def draw_degrees(self, im, degrees, color=(0,255,0)): - for i, item in enumerate(degrees.items()): - k, v = item + def draw_degrees(self, im, pose_data, color=(0,255,0)): + for i, pose_type in enumerate(self.pose_types.items()): + k, clr = pose_type + v = pose_data[k] t = '{}: {:.2f}'.format(k, v) origin = (10, 30 + (25 * i)) - cv.putText(im, t, origin, cv.FONT_HERSHEY_SIMPLEX, 0.5, color, thickness=2, lineType=2)
\ No newline at end of file + cv.putText(im, t, origin, cv.FONT_HERSHEY_SIMPLEX, 0.5, clr, thickness=2, lineType=2)
\ No newline at end of file |
