欧拉角 包括三个角度:pitch 俯仰角 roll 滚动角 yaw 为偏航角 。分别对应 X轴 Z轴 Y轴(注意据说在不同应用领域上 欧拉角和X Y Z 轴对应关系不一样)。
代码中: EulerAngles 为1*3的欧拉角向量 ,RotationMaxtrix 为通过cvRodrigues2 转换得到的旋转矩阵。
注意math 中atan asin acos函数得到的结果是弧度 单位 需要转换为角度: x*180.0f/PI , y*180.0f/PI, z*180.0f/PI
void RotationMatrixToEulerAngles(CvMat *EulerAngles ,CvMat *RotationMatrix)
{
double sy = sqrt(RotationMatrix->data.db[7]*RotationMatrix->data.db[7] + RotationMatrix->data.db[8];
int singular = (sy < 1e-6)? 1:0;
double x, y, z;
if (!singular)
{
x = atan2( (double)RotationMatrix->data.db[7] ,
(double)RotationMatrix->data.db[8] );
y = atan2( (double)-RotationMatrix->data.db[6], (double)sy );
z = atan2( (double)RotationMatrix->data.db[3], (double)RotationMatrix->data.db[0] );
}
else
{
x = atan2( (double)-RotationMatrix->data.db[5],
(double)RotationMatrix->data.db[4] );
y = atan2( (double)-RotationMatrix->data.db[6], (double)sy );
z = 0;
}
EulerAngles->data.db[0] = x*180.0f/PI;
EulerAngles->data.db[1] = y*180.0f/PI;
EulerAngles->data.db[2] = z*180.0f/PI;
}