Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
opencv Vec3d到Eigen::四元数,euler在结果上翻转_Opencv_Eigen_Quaternions_Opencv Solvepnp - Fatal编程技术网

opencv Vec3d到Eigen::四元数,euler在结果上翻转

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

我正在使用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;   

}

但我也看到了同样的变化

两个
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();