Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/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
Math 如何将3D协方差矩阵投影到给定的图像平面(姿势)_Math_3d_Computer Vision_Covariance_Kalman Filter - Fatal编程技术网

Math 如何将3D协方差矩阵投影到给定的图像平面(姿势)

Math 如何将3D协方差矩阵投影到给定的图像平面(姿势),math,3d,computer-vision,covariance,kalman-filter,Math,3d,Computer Vision,Covariance,Kalman Filter,我有一个三维点的3x3协方差矩阵,我想知道等效的二维协方差(图像平面中的u,v),给定图像姿势[Xc,Yc,Zc,q0,q1,q2,q3] 有一个很长的(几何)方法,3d协方差可以是一个3d椭圆,然后将它投影到平面上,得到2d椭圆,最后将椭圆转换成2d矩阵,但这很长 任何直接的方法,用代数方法解决这个问题都会有帮助 p.S:任何关于解决方案的线索或参考(不需要代码)也会有帮助,我会用代码重写答案(用c++) 我还标记了kalman滤波器,因为我认为它与之相关作为最初的想法,协方差矩阵的特征值分解

我有一个三维点的3x3协方差矩阵,我想知道等效的二维协方差(图像平面中的u,v),给定图像姿势
[Xc,Yc,Zc,q0,q1,q2,q3]

有一个很长的(几何)方法,3d协方差可以是一个3d椭圆,然后将它投影到平面上,得到2d椭圆,最后将椭圆转换成2d矩阵,但这很长

任何直接的方法,用代数方法解决这个问题都会有帮助

p.S:任何关于解决方案的线索或参考(不需要代码)也会有帮助,我会用代码重写答案(用c++)


我还标记了kalman滤波器,因为我认为它与之相关

作为最初的想法,协方差矩阵的特征值分解给出了旋转矩阵(特征向量)和幅值(特征值)

如果我们只知道摄像机平面的旋转为矩阵Rc,我们可以写:

N=Rc*特征向量

New_协方差=N*特征值*inv(N)#分解的主要关系

但是,我们必须确保特征向量排列为X,Y,Z

最后,我们将新_协方差的上2X2矩阵作为投影2D协方差(删除Z轴,因为它垂直于图像平面)

更新:

下面是一个Eigen库的实现:

Eigen::Matrix3f points_cov_2d(VectorXf cov_p,Quaternionf quatcam ,
   float z_m,float f_x,float f_y){
 Matrix3f cov3d;
 cov3d << cov_p(0),cov_p(1),cov_p(2),
          cov_p(3),cov_p(4),cov_p(5),
          cov_p(6),cov_p(7),cov_p(8);
 SelfAdjointEigenSolver<MatrixXf> eigenSolver(cov3d);
 Vector3f eigs = eigenSolver.eigenvalues();
 Matrix3f vecs = eigenSolver.eigenvectors();
 Matrix3f n_vecs = quatcam.toRotationMatrix()*vecs;
 Matrix3f cov2d = n_vecs*eigs*n_vecs.inverse();
 cov2d = cov2d *(1/z_m/z_m);
 cov2d(0)*=(f_x*f_x);
 cov2d(4)*=(f_y*f_y);
 cov2d(3)*=(f_x*f_y);
 cov2d(1)*=(f_x*f_y);
 cov2d.block<1,3>(2,0) << 0,0,0;
 cov2d.block<3,1>(0,2) << 0,0,0;
 return cov2d;
};
Eigen::Matrix3f points_cov_2d(向量x cov_p,四元数f四元凸轮,
浮动z_m,浮动f_x,浮动f_y){
Matrix3f-cov3d;
cov3d如何解析表示变换变量的协方差?
通过使用,可以解析地得到一阶近似值。特别是,关于非线性组合的段落基本上解释了以下内容:

已知变量
x
上的协方差
C_x
和函数
f
的雅可比矩阵
J_f
,协方差
f(x)
的一阶近似值由以下公式给出:
C_f(x)=J_f.C_x.J_f^T
,其中
^T
是换位运算符

如果我正确理解了你的问题,你就得到了在世界坐标系中表示的3D点的协方差,表示为
C_Xw
。你需要这个点在图像平面中投影的协方差,表示为
C_xi
。让我们用
f
表示将3D世界坐标映射到图像坐标的函数。然后我们有:
C_xi=J_f.C_Xw.J_f^T

如何计算雅可比矩阵? 在实践中,
f
是针孔投影函数,可分解如下:
f=f_intr o f_persp o f_pose
,其中:

  • f_intr
    应用intrinsics摄像机系数(即水平和垂直焦距
    fx
    fy
    、倾斜
    s
    、主点坐标
    cx
    cy
    ):
    f_intr([xn;yn])=[fx,s,cx;0,fy,cy]。[xn;yn 1]=[fx.xn+s.yn+cx+s.yn fy]

  • f_persp
    将针孔透视模型应用于摄影机坐标帧中的三维点:
    f_persp([Xc;Yc;Zc])=[Xc/Zc;Yc/Zc]

  • f_pose
    应用3D刚性变换(即旋转
    R_cw
    ,平移
    t_cw
    )将世界坐标系中的3D点映射到相机坐标系中的3D点:
    f_pose([Xw;Yw;Zw])=R_cw[Xw;Yw;Zw]+t_cw

  • 有助于表示组合函数的导数:

    如果
    f=f_intr o f_persp o f_pose
    ,并通过
    Xc=f_pose(Xw)
    xn=f_persp(Xc)
    xi=f_intr(xn)
    表示,则我们有以下内容:

    J_f(Xw)=J_f_intr(xn).J_f_persp(Xc).J_f_pose(Xw)

    f_intr
    f_persp
    f_pose
    的雅可比矩阵很容易解析表示:

  • f_intr
    xn
    中是线性的,因此
    J_f_intr=[fx,s;0,fy]
    是一个常数

  • J_f_persp(Xc)=[1/Zc,0,-Xc/Zc²;0,1/Zc,-Yc/Zc²]

  • f_pose
    Xw
    中是线性的,因此
    J_f_pose=R_cw
    是一个常数

  • 最终表达 最后,我们得到以下解析表达式:

    C_xi=J_f.C_Xw.J_f^T

    其中
    J_f=[fx,s;0,fy].[1/Zc,0,-Xc/Zc²;0,1/Zc,-Yc/Zc²].R_cw


    同样,这是一阶近似,但针孔投影函数“不是很非线性”,这意味着对于大多数应用来说,这样的近似值通常足够接近。

    太好了,我想我的答案基本上是错误的。@Yasinyous如果你最初的方法忽略了透视贴图。它可能接近于正交摄影机的解。我在这里用不同的方法导出了雅可比