How to do perspective correction in Matlab from known Intrinsic and Extrinsic parameters?

后端 未结 2 1499
鱼传尺愫
鱼传尺愫 2020-12-13 07:28

I\'m using Matlab for camera calibration using Jean- Yves Bouget\'s Camera Calibration Toolbox. I have all the camera parameters from the calibration procedure. When I use a

相关标签:
2条回答
  • 2020-12-13 07:58

    To all who are still interested in this after so many months, i've managed to get the correct homography matrix using Kovesi's code (http://www.csse.uwa.edu.au/~pk/research/matlabfns), and especially the homography2d.m function. You will need however the pixel values of the four corners of the rig. If the camera is steady fixed, then you will need to do this once. See example code below:

    %get corner pixel coords from base image
    p1=[33;150;1];
    p2=[316;136;1];
    p3=[274;22;1];
    p4=[63;34;1];
    por=[p1 p2 p3 p4];
    por=[0 1 0;1 0 0;0 0 1]*por;    %swap x-y <--------------------
    
    %calculate target image coordinates in world frame
    % rig is 9x7 (X,Y) with 27.5mm box edges
    XXw=[[0;0;0] [0;27.5*9;0] [27.5*7;27.5*9;0] [27.5*7;0;0]];
    Rtarget=[0 1 0;1 0 0;0 0 -1]; %Rotation matrix of target camera (vertical pose)
    XXc=Rtarget*XXw+Tc_ext*ones(1,4); %go from world frame to camera frame
    xn=XXc./[XXc(3,:);XXc(3,:);XXc(3,:)]; %calculate normalized coords
    xpp=KK*xn;  %calculate target pixel coords
    
    % get homography matrix from original to target image
    HH=homography2d(por,xpp);
    %do perspective transformation to validate homography
    pnew=HH*por./[HH(3,:)*por;HH(3,:)*por;HH(3,:)*por]; 
    

    That should do the trick. Note that Matlab defines the x axis in an image ans the rows index and y as the columns. Thus one must swap x-y in the equations (as you'll probably see in the code above). Furthermore, i had managed to compute the homography matrix from the parameters solely, but the result was slightly off (maybe roundoff errors in the calibration toolbox). The best way to do this is the above.

    If you want to use just the camera parameters (that is, don't use Kovesi's code), then the Homography matrix is H=KK*Rmat*inv_KK. In this case the code is,

    % corner coords in pixels
    p1=[33;150;1];
    p2=[316;136;1];
    p3=[274;22;1];
    p4=[63;34;1];
    pmat=[p1 p2 p3 p4];
    pmat=[0 1 0;1 0 0;0 0 1]*pmat; %swap x-y
    
    R=[0 1 0;1 0 0;0 0 1];  %rotation matrix of final camera pose
    Rmat=Rc_ext'*R;  %rotation from original pose to final pose
    H=KK*Rmat*inv_KK; %homography matrix
    pnew=H*pmat./[H(3,:)*pmat;H(3,:)*pmat;H(3,:)*pmat]; %do perspective transformation
    
    H2=[0 1 0;-1 0 0;0 0 1]*H;  %swap x-y in the homography matrix to apply in image
    
    0 讨论(0)
  • 2020-12-13 08:11

    Approach 1: In the Camera Calibration Toolbox you should notice that there is an H matrix for each image of your checkerboard in your workspace. I am not familiar with the computer vision toolbox yet but perhaps this is the matrix you need for your function. It seems that H is computed like so:

    KK = [fc(1) fc(1)*alpha_c cc(1);0 fc(2) cc(2); 0 0 1];
    H = KK * [R(:,1) R(:,2) Tc]; % where R is your extrinsic rotation matrix and Tc the translation matrix
    H = H / H(3,3);
    

    Approach 2: If the computer vision toolbox function doesn't work out for you then to find the prospective projection of an image I have used the interp2 function like so:

    [X, Y] = meshgrid(0:size(I,2)-1, 0:size(I,1)-1);
    im_coord = [X(:), Y(:), ones(prod(size(I_1)))]';
    % Insert projection here for X and Y to XI and YI
    ZI = interp2(X,Y,Z,XI,YI);
    

    I have used prospective projections on a project a while ago and I believe that you need to use homogeneous coordinates. I think I found this wikipedia article quite helpful.

    0 讨论(0)
提交回复
热议问题