查看位于同一平面上的点

校准:

我在Matlab中使用这个视觉工具箱校准了相机。 我用棋盘图像来做到这一点。 校准后,我得到cameraParams,其中包含:

Camera Extrinsics
RotationMatrices: [3x3x18 double]
TranslationVectors: [18x3 double]

 Camera Intrinsics
 IntrinsicMatrix: [3x3 double]
 FocalLength: [1.0446e+03 1.0428e+03]
 PrincipalPoint: [604.1474 359.7477]
 Skew: 3.5436

目的:我使用这台相机记录了一些运动物体的轨迹。 每个对象对应一个框架中的单个点。 现在,我想投射点,让我得到一个顶视图。

  • 注意我希望变换的所有这些点都在同一个平面上。

    例如:[xcor_i,ycor_i]

    -101.7000  -77.4040
    -102.4200  -77.4040
    
  • 关键点 :该平面垂直于用于校准的棋盘图像之一。 对于这张图片(下图),我知道从地面(193.040厘米)棋盘格的起源高度。 投射点的平面与地面平行并垂直于该图像。
  • 图1

    代码 (参考:https://stackoverflow.com/a/27260492/3646408和下面的@Dima回答):

    function generate_homographic_matrix()
    %% Calibrate camera
    % Define images to process
    path=['.' filesep 'Images' filesep];
    list_imgs=dir([path '*.jpg']);
    list_imgs_path=strcat(path,{list_imgs.name});
    
    % Detect checkerboards in images
    [imagePoints, boardSize, imagesUsed] = detectCheckerboardPoints(list_imgs_path);
    imageFileNames = list_imgs_path(imagesUsed);
    
    % Generate world coordinates of the corners of the squares
    squareSize = 27;  % in units of 'mm'
    worldPoints = generateCheckerboardPoints(boardSize, squareSize);
    
    % Calibrate the camera
    [cameraParams, imagesUsed, estimationErrors] = estimateCameraParameters(imagePoints, worldPoints, ...
        'EstimateSkew', true, 'EstimateTangentialDistortion', true, ...
        'NumRadialDistortionCoefficients', 3, 'WorldUnits', 'mm');
    %% Compute homography for peripendicular plane to checkerboard
    % Detect the checkerboard 
    im=imread(['.' filesep 'Images' filesep 'exp_19.jpg']); %exp_19.jpg is the checkerboard orthogonal to the floor
    [imagePoints, boardSize] = detectCheckerboardPoints(im);
    
    % Compute rotation and translation of the camera.
    [Rc, Tc] = extrinsics(imagePoints, worldPoints, cameraParams);
    
    % Rc(rotation of the calibration view w.r.t the camera) = [x y z])
    %then the floor has rotation Rf = [z x -y].(Normal vector of the floor goes up.)
    Rf=[Rc(:,3),Rc(:,1),Rc(:,2)*-1];
    
    % Translate it to the floor
    H=452;%distance btw origin and floor
    Fc = Rc * [0; H; 0];
    Tc = Tc + Fc';
    
    % Combine rotation and translation into one matrix:
    Rf(3, :) = Tc;
    
    % Compute the homography between the checkerboard and the image plane:
    H = Rf * cameraParams.IntrinsicMatrix;
    
    save('homographic_matrix.mat','H')
    end
    

    %% Transform points
    function [x_transf,y_transf] =transform_points(xcor_i,ycor_i)
    % creates a projective2D object and then transforms the points forward to
    % get a top-view
    % xcor_i and ycor_i are 1d vectors comprising of the x-coordinates and
    % y-coordinates of trajectories. 
    data=load('homographic_matrix.mat');
    homo_matrix=data.H;
    tform=projective2d(inv(homo_matrix));
    [x_transf,y_transf] = transformPointsForward(tform,xcor_i,ycor_i);
    end
    

    引用来自OReilly Learning OpenCV的文本第412页:“一旦我们有了单应矩阵和高度参数集,我们就可以移除棋盘并驱动购物车,制作路径的鸟瞰视频...... “这是我基本希望实现的。


    阿布舍克,

    我不完全明白你在做什么。 你是否在飞机上的点,你想创建一架飞机的鸟瞰图?

    如果是这样,那么你需要知道extrinsics,R和t,描述该平面和相机之间的关系。 获得R和t的一种方法是在棋盘上放置棋盘,然后使用extrinsics函数。

    之后,您可以按照您引用的问题中的说明获取单应性。 一旦你有单应性,你可以创建一个projective2D对象,并使用它的transformPointsForward方法来转换你的观点。


    既然你在网格上有正方形的大小,那么给定你知道的2个点通过大小为E的边(以真实世界单位)连接,你可以计算它们的3D位置。

    以相机固有矩阵K和三维位置C以及相机方向矩阵R ,您可以通过执行来计算每个点p的光线:

    D = R^T * K^-1 * p
    

    每个3D点的定义如下:

    P = C + t*D
    

    并且你有||P1-P2|| = E的约束 ||P1-P2|| = E那么它就是求解t1,t2并找出两点的3D位置的问题。

    为了创建顶视图,您可以采用3D点并使用该顶视图的相机模型进行投影,以生成新图像。

    如果你的所有点都在一架飞机上,计算3点的位置就足够了,你可以推断其余的点。

    如果你的点位于一个你知道一个坐标的平面上,你可以简单地为每个点进行。 例如,如果您知道您的相机位于h=Cz高度,并且您希望在帧中找到三维点的位置(假设它们位于地板上(z = 0)),那么您只需要做如上计算方向D ,然后:

    t=abs( (h-0)/D.z )
    

    0代表飞机的高度。 用其他飞机替代任何其他值。

    现在你有t的值,你可以计算每个点的3D位置: P=C+t*D

    然后,要创建顶视图,请创建一个新的摄像机位置和旋转以匹配您所需的投影,并且可以将每个点投影到该摄像机的图像平面上。 如果你想要一个完整的图像,你可以插入位置并填写没有特征点的空白。

    欲了解更多详情,你可以阅读:http://www.robots.ox.ac.uk/~vgg/hzbook/index.html

    链接地址: http://www.djcxy.com/p/30629.html

    上一篇: view for points that lie on a same plane

    下一篇: Kinect One calibration using OpenCV