【问题标题】:Estimating distance to a point using camera calibration使用相机校准估计到点的距离
【发布时间】:2015-03-17 14:42:42
【问题描述】:

我想从该点的给定像素坐标估计距离(相机到地面上的一点:这意味着 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 坐标是

这是我的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 arbitrary 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'

【问题讨论】:

  • 欢迎来到 SO。尽管您已经描述了您的程序,但您的 Matlab 代码会更容易在答案中使用,因为误解的可能性较小。另外,您能否澄清一下“没有意义”——也许给出一个示例输入和预期输出?
  • 你的程序看起来是正确的,所以你应该在某个地方犯了错误。 AsNeil 建议,将您的代码与解释部分一起发布,因为这样更容易调试。
  • 我通过添加 matlab 代码编辑了我的帖子。谢谢
  • 我还添加了代码的结果和问题

标签: matlab opencv camera-calibration homography


【解决方案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的solvePnPstereo-vision depth estimation。 solvePnP 需要 4 个共面(在 RW 空间中)特征在图像中可用,并且特征在 RW 空间中的位置是已知的。这听起来可能没什么用,因为您需要知道特征的 RW 位置,但您可以简单地使用 已知偏移量 定义 4 个特征,而不是全局框架中的位置 - 结果将是相机在定义特征的帧中的相对位置。solvePnP 给出了相机的非常准确的位姿估计。见我的example

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

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

【讨论】:

  • 谢谢。我的应用程序正在估计到行人的距离,我将只考虑到检测到的行人边界框底部的距离。我假设世界是平的。有了这些假设和要求,是不是不可能像我的代码那样通过简单的矩阵乘法得到距离?
  • 我已经添加了从 2D->3D 点转换的示例代码,因为您的内在和外在是已知的,并且您的相机在全局框架中是固定的。我曾假设您的相机正在移动,因此此方法不起作用,但是据我所知,您的相机是静止的,您可以假设边界框处于给定高度(从行人的脚在地面上)。对造成的误解深表歉意。
  • 摄像机固定在移动的车辆上。我不考虑行人的身高。我只考虑边界框的底部中点(行人接触地面的点)。我的要求是与行人保持距离以避免碰撞。我不知道行人的真实世界位置。我想通过仅使用单目图像来找到它。当我只知道相机的内在和外在时,这是不可能的吗?有必要使用立体视觉吗?
  • 你只需要知道特征的RW位置的Z分量,如果我理解你的话,在你的情况下是行人的脚正确。除非行人在跳跃/飞行,否则 Z 分量将非常接近常数。一旦您的相机从校准姿势移动,外部矩阵就不再有效。所以你不能使用我在答案前半部分描述的方法,除非你有一个准确的持有相机的车辆的姿势。如果您已经有一个正在工作的特征检测器,那么实现立体视觉深度估计将非常简单。
  • 我的理解是,如果假设世界是平的,那么Z分量可以假设为0(行人不跳跃/飞行)。我知道从地面到相机的高度和相机间距。这些信息不足以估计与单眼视觉的距离吗?我对这种方法也没有信心。
猜你喜欢
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 2021-05-10
  • 1970-01-01
  • 2011-04-05
  • 2018-11-28
  • 1970-01-01
相关资源
最近更新 更多