opencv Vec3d到Eigen::四元数,euler在结果上翻转
我正在使用opencv::solvePnP返回相机姿势。我运行PnP,它返回rvec和tvec值(旋转向量和位置) 然后,我运行此函数将值转换为摄影机姿势:opencv Vec3d到Eigen::四元数,euler在结果上翻转,opencv,eigen,quaternions,opencv-solvepnp,Opencv,Eigen,Quaternions,Opencv Solvepnp,我正在使用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 = Doubl
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;
}
但我也看到了同样的变化 两个
quat
和-quat
表示相同的旋转。您可以通过获取单位四元数,将其转换为旋转矩阵,然后执行
quat.coeffs() = -quat.coeffs();
并将其转换为旋转矩阵。
如果出于某种原因,您总是想要一个正的
w
值,那么如果w
为负,则否定所有系数。符号应该无关紧要
。。。旋转方向,只要4D四元数的所有四个字段都翻转。这里有更多的解释:
这样想:
注意从顺时针到逆时针的转换,就像镜像一样
可能有一种惯例,即保持quat.w()
或quat[0]
组件为正,并相应地将其他组件更改为相反。假设w=cos(angle/2)
然后设置w>0
仅仅意味着:我希望angle
在(-pi,pi)
范围内。使-270度旋转变成+90度旋转
执行quat.Inverse()
可能不是您想要的,因为这会创建一个相反方向的旋转。那是-quat!=quat.Inverse()
另外:检查两个系统是否具有相同的用手习惯()!测试旋转矩阵行列式是+1还是-1
(sry对于图像链接,我没有足够的声誉来嵌入它们)。你应该已经阅读了你发现的问题的另一个答案:基本上,如果w是负数,那么否定x,y和z?是吗?谢谢。我将数据分配给一个3d模型,翻转明显表现为巨大的旋转跳跃。您如何“将数据分配给3d模型”?我想这就是你们的实际错误所在。在虚幻引擎中,我相信这一方是正确的。我也尝试过opengl。我在这两个方面都看到了相同的翻转。好吧,我相信四元数的符号在用于表示三维旋转时并不重要……我将仔细检查我的应用程序,但这是我以前多次使用的应用旋转的相同方法。也许我遇到了一个与翻转不同的问题。我上面的转换看起来正确吗?嗨,我仍然有这个问题。我正在做以下工作:
if(EigenQuat.w()<0){EigenQuat.x()=EigenQuat.x()*-1;EigenQuat.y()=EigenQuat.y()*-1;EigenQuat.z()=EigenQuat.z()*-1;EigenQuat.w()=EigenQuat.w()*-1;}
这很有帮助,但我仍然可以从某个角度看到我的3d模型的翻转。这是正确的方法吗?我也尝试过在w为负数时翻转xyz,效果相同。你能提供更多关于实际数据/屏幕截图/输出值的信息吗?另请参见:我正在记录数据,并看到一些奇怪的情况。对于上面原始问题中的代码,翻转看起来如下:rvec:[-1.9554,0.0461893,0.762008]quat:0.807827-0.019082-0.314805-0.497945 rvec:[-1.94081,0.0626131,0.774592]quat:-0.803091 0.0259088 0.32052 0.501638
,您可以清楚地看到quat翻转,而rvec值保持不变。在我的模型上,当我(如果w…在三维空间中否定xyz)时,翻转看起来像是一个非常快的旋转,180度,然后返回。
quat.coeffs() = -quat.coeffs();