2

在您的帮助下,我已经能够使用 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为:

    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。我不知道我在这里做错了什么。请帮帮我!!

4

1 回答 1

1

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

Xcam = K*[R t]*Xworld

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

K =

3.3202         0   -0.0229
     0    3.3202    0.0153
     0         0    1.0000

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

于 2012-07-22T07:03:57.473 回答