使用相机校准估算到点的距离

时间:2015-01-19 14:47:56

标签: matlab opencv camera-calibration homography

我想从该点的给定像素坐标估计距离(相机到地面上的点:这意味着Yw = 0)。为此我使用了相机校准方法

但结果没有意义。

我有以下校准细节

- 焦距x和y,主要点x和y,以米为单位的有效像素大小,偏航和俯仰角以及摄像机高度等。

- 我已根据计算像素输入了焦距,主要点和平移向量

- 我将图像点与camera_matrix相乘,然后旋转|翻译矩阵(R | t),以获得世界观点。

我的手术是否正确?什么可能是错的?

结果
  image_point(x,y)= 400,380
  world_point z坐标(距离)= 12.53

image_point(x,y)= 400,180
  world_point z坐标(距离)= 5.93

问题 z坐标的像素非常少, 这意味着z坐标是<&lt;&lt; 1米,(因为有效像素大小以米为单位= 10 ^ -5)

这是我的matlab代码

%positive downward pitch
xR = 0.033;
yR = 0;
zR = pi;



%effective pixel size in meters = 10 ^-5 ; focal_length x & y = 0.012 m 
% principal point x & y = 320 and 240 
intrinsic_params =[1200,0,320;0,1200,240;0,0,1];
Rx=[1,0,0 ; 0,cos(xR),sin(xR); 0,-sin(xR),cos(xR)];
Ry=[cos(yR),0,-sin(yR) ; 0,1,0 ; sin(yR),0,cos(yR)];
Rz=[cos(zR),sin(zR),0 ; -sin(zR),cos(zR),0 ; 0,0,1];

R= Rx * Ry * Rz ;


% The camera is 1.17m above the ground
t=[0;117000;0];

extrinsic_params = horzcat(R,t);

% extrinsic_params is  3 *4  matrix

P = intrinsic_params * extrinsic_params; % P 3*4 matrix

% make it square ....
P_sq = [P; 0,0,0,1];

%image size is 640 x 480
%An arbitary pixel 360,440 is entered as input

image_point = [400,380,0,1]; 
% world point will be in the form X Y Z 1 
world_point =    P_sq *  image_point'

谢谢

1 个答案:

答案 0 :(得分:1)

你的程序是正确的,但它的方向是错误的。 见link。使用内在和外在校准矩阵,您可以找到真实世界向量像素空间位置,而不是相反。例外情况是,如果您的相机在全局框架中静止并且您在全局空间中具有该要素的Z位置。

固定摄像机,已知功能Z案例:(另见this link

%% First we simulate a camera feature measurement
K = [0.5 0 320;
    0 0.5 240;
    0 0 1]; % Example intrinsics
R = rotx(0)*roty(0)*rotz(pi/4); % orientation of camera in global frame
c = [1; 1; 1]; %Pos camera in global frame

rwPt = [ 10; 10; 5]; %position of a feature in global frame
imPtH = K*R*(rwPt - c); %Homogeneous image point
imPt = imPtH(1:2)/imPtH(3) %Actual image point


%% Now we use the simulated image point imPt and the knowledge of the
% features Z coordinate to determine the features X and Y coordinates
%% First determine the scaling term lambda
imPtH2 = [imPt; 1]; 
z = R.' * inv(K) * imPtH2;
lambda = (rwPt(3)-c(3))/z(3);

%% Now the RW position of the feature is:
rwPt2 = c + lambda*R.' * inv(K) * imPtH2 % Reconstructed RW point

非固定相机包:

要查找从相机到特定要素(在图像平面上给出)的真实世界位置或距离,您必须采用某种方法从2D图像重建3D数据。

立即浮现在脑海中的两个是opencv&#39; solvePnPstereo-vision depth estimation。 solvePnP需要在图像中提供4个共面(在RW空间中)特征,并且已知RW空间中的特征的位置。这可能听起来不太有用,因为您需要知道要素的RW位置,但您可以使用已知偏移量而不是全局帧中的位置来定义4个要素 - 结果将是相机在帧中的相对位置定义了特征.resolutionPnP给出了非常相机的准确姿态估计。查看我的example

立体视觉深度估计需要在两个空间分离的图像中找到相同的特征,并且RW空间中的图像之间的转换必须精确地知道非常

可能还有其他方法,但这些是我熟悉的两种方法。