Я работаю над учебником по оценке позы Python и OpenCV, найденным здесь:
https://www.learnopencv.com/head-pose-estimation-using-opencv-and-dlib/
Я могу точно проецировать 3D-точку на 2D-изображение. Однако я не могу понять практический смысл углов Эйлера (рыскание, шаг, крен), которые я вычисляю, используя cv2.decomposeProjectionMatrix
Мне нужно знать, соответствуют ли значения (рыскание, тангаж, крен) или (крен, тангаж, рыскание) и т. Д. Кроме того, мне нужно понять используемую ориентацию оси, чтобы я мог знать, где градусы вращения измеряется от.
Выходное изображение : https://www.learnopencv.com/wp-content/uploads/2016/09/head-pose-example-1024x576.jpg
Выходные углы : [[-179.30011146], [ 53.77756583], [-176.6277211 ]]
Вот мой код
# --- Imports ---
import cv2
import numpy as np
# --- Main ---
if __name__ == "__main__":
# Read Image
im = cv2.imread("headPose.jpg");
size = im.shape
#2D image points. If you change the image, you need to change vector
image_points = np.array([
(359, 391), # Nose tip
(399, 561), # Chin
(337, 297), # Left eye left corner
(513, 301), # Right eye right corne
(345, 465), # Left Mouth corner
(453, 469) # Right mouth corner
], dtype="double")
# 3D model points.
model_points = np.array([
(0.0, 0.0, 0.0), # Nose tip
(0.0, -330.0, -65.0), # Chin
(-225.0, 170.0, -135.0), # Left eye left corner
(225.0, 170.0, -135.0), # Right eye right corne
(-150.0, -150.0, -125.0), # Left Mouth corner
(150.0, -150.0, -125.0) # Right mouth corner
])
# Camera internals
focal_length = size[1]
center = (size[1]/2, size[0]/2)
camera_matrix = np.array(
[[focal_length, 0, center[0]],
[0, focal_length, center[1]],
[0, 0, 1]], dtype = "double"
)
# Lens distortion - assumed to be zero
dist_coeffs = np.zeros((4,1))
# Calculate perspective and point
(_, rvec, tvec) = cv2.solvePnP(model_points, image_points, camera_matrix, dist_coeffs, flags=cv2.SOLVEPNP_ITERATIVE)
# Calculate Euler angles
rmat = cv2.Rodrigues(rvec)[0] # rotation matrix
pmat = np.hstack((rmat, tvec)) # projection matrix
eulers = cv2.decomposeProjectionMatrix(pmat)[-1]
print(eulers)
# Projecting a 3D point
## features
for p in image_points:
cv2.circle(im, (int(p[0]), int(p[1])), 3, (0,0,255), -1)
## projection of multiple points
proj = np.array([(0., 0., 1000.)])
(poi1, jacobian1) = cv2.projectPoints(model_points[0]+proj, rvec, tvec, camera_matrix, dist_coeffs)
## 2D space
p1 = ( int(image_points[0][0]), int(image_points[0][1]))
c1 = ( int(poi1[0][0][0]), int(poi1[0][0][1]))
cv2.line(im, p1, c1, (255,0,0), 2)
# Display image
cv2.imshow("Output", im)
cv2.waitKey(0)
Тестовое изображение : https://www.learnopencv.com/wp-content/uploads/2016/09/headPose.jpg
Спасибо!