我正在使用 opencv::solvePnP 返回相机姿势。我运行 PnP,它返回 rvec 和 tvec 值。(旋转向量和位置)。
然后我运行此函数将值转换为相机姿势:
void GetCameraPoseEigen(cv::Vec3d tvecV, cv::Vec3d rvecV, Eigen::Vector3d &Translate, Eigen::Quaterniond &quats)
{
Mat R;
Mat tvec, rvec;
tvec = DoubleMatFromVec3b(tvecV);
rvec = DoubleMatFromVec3b(rvecV);
cv::Rodrigues(rvec, R); // R is 3x3
R = R.t(); // rotation of inverse
tvec = -R*tvec; // translation of inverse
Eigen::Matrix3d mat;
cv2eigen(R, mat);
Eigen::Quaterniond EigenQuat(mat);
quats = EigenQuat;
double x_t = tvec.at<double>(0, 0);
double y_t = tvec.at<double>(1, 0);
double z_t = tvec.at<double>(2, 0);
Translate.x() = x_t * 10;
Translate.y() = y_t * 10;
Translate.z() = z_t * 10;
}
这是可行的,但在某些旋转角度,转换后的旋转值会在正值和负值之间随机翻转。然而,源rvecV
值没有。我认为这意味着我的转换出错了。如何从 PnP 返回的 cv::Vec3d 中获得稳定的四元数?
编辑:这似乎是四元数翻转,如此处所述:
基于此,我尝试添加:
if(quat.w() < 0)
{
quat = quat.Inverse();
}
但我看到同样的翻转。