gpt4 book ai didi

opencv - opencv Vec3d到Eigen::Quaternion,欧拉翻转结果

转载 作者:行者123 更新时间:2023-12-02 17:37:23 24 4
gpt4 key购买 nike

我正在使用opencv::solvePnP返回相机姿势。我运行PnP,它返回rvec和tvec值。(旋转 vector 和位置)。

然后,我运行此函数将值转换为相机姿态:

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;

}

这可以工作,但是在某些旋转 Angular 下,转换后的旋转值会在正值和负值之间随机翻转。但是,源 rvecV值没有。我认为这意味着我的转换有误。如何从返回的Cn::Vec3d的PnP中获得稳定的四元数?

编辑:这似乎是四元数翻转,如下所述:

Quaternion is flipping sign for very similar rotations?

基于此,我尝试添加:
if(quat.w() < 0)
{
quat = quat.Inverse();
}

但是我看到同样的翻转。

最佳答案

quat-quat都表示相同的旋转。您可以通过将一个四元数转换为旋转矩阵然后进行

quat.coeffs() = -quat.coeffs();

并将其转换为旋转矩阵。
如果由于某种原因您总是想要一个正的 w值,则在 w为负的情况下取反所有系数。

关于opencv - opencv Vec3d到Eigen::Quaternion,欧拉翻转结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49339007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com