姿势估计

时间:2012-07-20 22:52:38

标签: matlab 3d camera-calibration perspectivecamera

在您的帮助下,我已经能够使用CvPosit估计相机姿势(使用此链接http://www.aforgenet.com/articles/posit/)。我正在使用MATLAB代码。

现在我希望通过在图像坐标上投射3D点来验证该姿势。详情如下:

  1. 假设多维数据集的图像点数和世界点数为:

    World Points=[28 28 -28;-28 28 -28;28 -28 -28, 28 28 28]
    Image_Points=[-4 29;-180 86;-5 -102;76 137];
    
  2. 获得的姿势是:

    Pose =[0.896 0.0101 0.4439 -13.9708;-0.3031 0.7127 0.6326 13.7039;-0.3100 -0.701 0.6416 164.5663;0 0 0 1];
    

    我在我的例子中使用了640作为焦距。现在从这个姿势开始,我想使用3D点并将其投影回来以获得2D图像点。理想情况下,我应该得到同样的观点。但我无法得到它。我在MATLAB中使用以下方式:

  3. 我们说P = [28;28;28;28;1] % 4 X 1 matrix for a 3D point

    P_Camera= Pose *  P;  
    
    Calibration Matrix (K)=[640 0 0 0;0 640 0 0;0 0 1 0;0 0 0 1];
    
    Image Points= P_Camera*K;           
    

    我得到x = 15251y = 27447。我不知道我在这里做错了什么。请帮帮我!!

1 个答案:

答案 0 :(得分:1)

相机姿势或相机外部参数由旋转R和平移t组成。我相信你的Pose矩阵实际上是[R t; [0 0 0 1]]。要将3D均匀点(4x1)转换为相机坐标,您需要:

Xcam = K*[R t]*Xworld

其中K是3x3 camera matrix,包含相机内部(内部)参数。 如果您将K设置为:

,请稍微使用您的数字
K =

3.3202         0   -0.0229
     0    3.3202    0.0153
     0         0    1.0000

你会得到一个接近的答案(这个K不适合你的F = 640的数据,但它是带有输入点和姿势的LS解决方案)。 但仍有一些错误。尝试校准相机并考虑光学失真(Matlab here有一个很好的相机校准工具箱。