Как сравнить две разные матрицы вращения и углы Эйлера для оценки позы головы - PullRequest
0 голосов
/ 18 апреля 2019

Я работаю над оценкой лица, используя dlib и opencv из сохраненного видео.

Я могу получить матрицу поворота головы и угол Эйлера, используя функцию opencv solvepnp в каждом кадре. Мой вопрос: как я могу получить разность углов между двумя последовательными кадрами на основе матрицы поворота или матрицы углов Эйлера?

std::vector<cv::Point3d> object_pts; //generic 3D world coordinate
std::vector<cv::Point2d> image_pts; //dlib landmark points
cv::Mat rotation_vec;    //3 x 1
cv::Mat rotation_mat;    //3 x 3 R
cv::Mat translation_vec;

//calc pose
cv::solvePnP(object_pts, image_pts, cam_matrix, dist_coeffs, rotation_vec, translation_vec);

//calc euler angle
cv::Rodrigues(rotation_vec, rotation_mat);
cv::hconcat(rotation_mat, translation_vec, pose_mat);
cv::decomposeProjectionMatrix(pose_mat, out_intrinsics, out_rotation, out_translation, cv::noArray(), cv::noArray(), cv::noArray(), euler_angle);

Это пример матрицы углов поворота и Эйлера из двух кадров:

First frame : 
rotation_mat: [0.9808042880813987, -0.00560492255811192, -0.194914169121329;
 -0.009358357320917634, 0.9970819362297282, -0.07576300939528717;
 0.1947700429465335, 0.07613276093439612, 0.9778897857545662]

Euler_angle[4.451733321076386;
 -11.23129045806711;
 -0.5466718623384634]

Second frame: 
rotation_mat: [0.9821961040283421, -0.005362175244554571, -0.1877819488347928;
 -0.01108060484669302, 0.9961985559469002, -0.08640403535450306;
 0.1875314198415228, 0.0869464444699003, 0.9784029243447022]

Euler_angle[5.078288701210371;
 -10.80875560893563;
 -0.6463525542012101]

Моя цель - найти одну позу в качестве базовой линии и сравнить другую позу головы в каждом кадре, чтобы определить, насколько она отклоняется от базовой линии.

С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...