#python #opencv #euler-angles
#python #opencv #углы эйлера
Вопрос:
Я использую solvePnP следующим образом..
import cv2
import numpy as np
# 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"
)
print "Camera Matrix :n {0}".format(camera_matrix)
dist_coeffs = np.zeros((4,1)) # Assuming no lens distortion
(success, rotation_vector, translation_vector) = cv2.solvePnP(model_points, image_points, camera_matrix, dist_coeffs, flags=cv2.CV_ITERATIVE)
print "Rotation Vector:n {0}".format(rotation_vector)
print "Translation Vector:n {0}".format(translation_vector)
Я в замешательстве относительно того, что такое вектор поворота и вектор перевода на самом деле? Я думаю, мне нужно преобразовать их в углы Эйлера, чтобы получить 3 значения для тангажа, крена и рыскания.
Правильно ли это? У кого-нибудь есть пример этого?
Ответ №1:
rvecs — это представление угла поворота оси, для которого обычно требуются 4 числа, [v, тета], но v должно быть единичным вектором, и, следовательно, его длина кодируется как тета, уменьшая требуемые числа до 3.
для кода это должно быть что-то вроде этого.
def pnp(objectPoints,imgPoints,w,h,f):
cameraMatrix = np.array([[f,0,w/2.0],
[0,f,h/2.0],
[0,0,1]])
distCoeffs = np.zeros((5,1))
revtval,rvecs, tvecs =cv2.solvePnP(objectPoints[:,np.newaxis,:], imgPoints[:,np.newaxis,:], cameraMatrix, distCoeffs)#,False,flags=cv2.SOLVEPNP_EPNP)
return rvecs,tvecs
def rot_params_rv(rvecs):
from math import pi,atan2,asin
R = cv2.Rodrigues(rvecs)[0]
roll = 180*atan2(-R[2][1], R[2][2])/pi
pitch = 180*asin(R[2][0])/pi
yaw = 180*atan2(-R[1][0], R[0][0])/pi
rot_params= [roll,pitch,yaw]
return rot_params