【问题标题】:Matlab Dissecting Extracting Camera Projection Matrix to position and rotationMatlab解剖提取相机投影矩阵以定位和旋转
【发布时间】:2017-07-24 08:27:32
【问题描述】:

我在空间中有 6 个点,已知坐标以 mm 为单位,图像中对应的 2D 像素坐标(图像大小为 640x320 像素,点坐标是从图像的左上角测量的。我还有相机的焦距为 43.456mm. 试图找到相机的位置和方向。 我在这里的matlab代码会给我相机位置-572.8052 -676.7060 548.7718 并且看起来是正确的,但我很难找到方向值(相机的偏航俯仰滚动以度为单位) 我知道旋转值应该是 60.3,5.6,-45.1 我的代码中的最后 4 行需要更新以输出相机的方向。 我真的很感谢你在这方面的帮助。 谢谢。

这是我的matlab代码:

Points_2D= [135 183 ; 188 129 ; 298 256 ; 301 43 ; 497  245; 464 110];

Points_3D= [-22.987 417.601 -126.543 ; -132.474 37.67 140.702 ; ...
            388.445 518.635 -574.784 ; 250.015 259.803 67.137 ; ...
            405.915 -25.566 -311.834 ; 568.859 164.809 -162.604  ];


M = [0;0;0;0;0;0;0;0;0;0;0]; 

A = []; 
for i = 1:size(Points_2D,1) 
    u_i = Points_2D(i,1); 
    v_i = Points_2D(i,2); 
    x_i = Points_3D(i,1); 
    y_i = Points_3D(i,2); 
    z_i = Points_3D(i,3); 
    A_vec_1 = [x_i y_i z_i 1 0 0 0 0 -u_i*x_i -u_i*y_i -u_i*z_i -u_i]; %
    A_vec_2 = [ 0 0 0 0 x_i y_i z_i 1 -v_i*x_i -v_i*y_i -v_i*z_i -v_i]; %
    A(end+1,:) = A_vec_1;
    A(end+1,:) = A_vec_2;
end 

[U,S,V] = svd(A);
M = V(:,end);
M = transpose(reshape(M,[],3));

Q = M(:,1:3); 
m_4 = M(:,4); 
Center = (-Q^-1)*m_4


k=[43.456/640 0 320 ;0 43.456/320 160;0 0 1 ];
Rotation= (Q^-1)*k;
CC=Rotation'
eul=rotm2eul(CC)

【问题讨论】:

  • 您还需要这方面的帮助吗?还是你已经完成了一项家庭作业/项目?
  • 不,我仍在寻找解决方案,我离开学校已经好几年了!你能帮忙吗?
  • 您想要找到的究竟是什么?相机相对于位置的旋转和平移,即相机中心的 (0,0)?
  • 我有 0,0,0 作为世界的原点,还有空间中 6 个点的 3d 坐标 (x,y,z) 场景中有一台相机拍摄了这 6 个点的照片所以我有照片中这些点的二维坐标(x,y)。我正在尝试查找拍摄照片的相机的位置和方向。我的代码找到了看起来不错的位置,但我需要以度为单位找到相机的方向(偏航、俯仰、滚动)。每个人都说这很容易做到,但从未找到解决方案。如果需要的话,我也知道相机的焦距是 43.456mm..
  • 如果您或第一个可以根据这些已知信息编写 matlab 代码来查找相机位置和方向的人,我将通过 paypal 支付 100 美元,我不是在开玩笑。

标签: matlab matrix camera projection calibration


【解决方案1】:

第一件事:6分就够了,但很可能你有一些错误。为了获得更好的性能,建议有 6 个以上的点,最好是 10-15。

您的代码似乎正确,直到:

Q = M(:,1:3); 
m_4 = M(:,4); 

所以您正在寻找相机的外在和内在参数,即rotationtranslationalpha(x 方向倾斜)、robeta(x 方向倾斜)、@ 987654328@,v0(相机中心翻译)。所以一共有5个内在参数,6个外在参数。

这是link,它解释了如何计算这些参数的详细信息。我有一个没有彻底测试的代码,可能有一些错误,但它在我的情况下是有效的。

M 继续,这是您找到的 3x4 矩阵:

a1 = M(1, 1:3);
a2 = M(2, 1:3);
a3 = M(3, 1:3);

b = M(1:3,4);

% Decomposition of the parameters
eps = 1; %this can be -1 or +1, based on the value you choose, you will have two different results.
ro = eps/sqrt(sumsqr(a3));
r3 = ro*a3;
u0 = ro.^2*(dot(a1,a3))
v0 = ro.^2*(dot(a2,a3))

cos_theta = -dot(cross(a1,a3),cross(a2,a3))/ ...
         dist_cross(a1,a3)/(dist_cross(a2,a3));
theta = acos(cos_theta);
alpha = ro^2*dist_cross(a1,a3)*sin(theta)
beta = ro^2*dist_cross(a2,a3)*sin(theta)
theta_deg = theta*180/pi
r1 = 1/dist_cross(a2,a3)*cross(a2,a3);
r2 = cross(r3,r1);
R = [r1;r2;r3] % Rotation matrix 3x3

% ro*A.inv(R) = K
K = [alpha  -alpha*cot(theta) u0;
     0      beta/sin(theta)   v0;
     0              0         1  ];
T = ro*(inv(K)*b) % Translation matrix, 1x3

在哪里

function [dis] = dist_cross(mi,mj)
    dis = sqrt(sumsqr(cross(mi,mj)));
end

我不保证它是完全正确的,但它应该会有所帮助。

【讨论】:

  • 今晚回家后我会试运行这个。如果它有效,你就是我的英雄..
  • 它没有用。我的问题更简单,我没有任何歪斜或失真参数。,我也知道你的代码中的焦距,不确定它在哪里。。
  • 输出是什么,或者错误是什么? Skew 和 alpha, beta 是内在参数。如果您的相机没有歪斜,那么,theta 将为 pi/2。 Alpha 与像素密度或一个像素的长度有关。
  • 好的,我正在尝试让它工作,我的图像中没有歪斜或失真,所以这意味着 alpha 是 pi/2 对吗?那么测试版呢?什么是 theta 我知道图像的分辨率是 640x320。这是否意味着我必须将 u0 和 v0 设置为 320 和 160?再次感谢。
  • 我希望得到 60.3、5.6、-45.1 度的旋转角度。但是这段代码为 R 输出了一个 3x3 矩阵。我使用 rotm2eul(R) 来获取角度,但它们甚至不接近我期望的角度。
猜你喜欢
  • 2014-07-31
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多