Math 如何将3D协方差矩阵投影到给定的图像平面(姿势)
我有一个三维点的3x3协方差矩阵,我想知道等效的二维协方差(图像平面中的u,v),给定图像姿势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滤波器,因为我认为它与之相关作为最初的想法,协方差矩阵的特征值分解
[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如果你最初的方法忽略了透视贴图。它可能接近于正交摄影机的解。我在这里用不同的方法导出了雅可比