本文介绍了如何做透视校正在Matlab从已知的内在和外在参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Matlab进行相机校准,使用。我有校准程序的所有摄像机
参数。当我在校准集中使用新的图像而不是
时,我可以得到它的变换方程。
Xc = R * X + T,其中X是在
世界框架中的校准装置(平面)的3D点,Xc是它在摄像机框架中的坐标。在其他
字中,我有一切(外部和内部参数)。

I'm using Matlab for camera calibration using Jean-Yves Bouget's Camera Calibration Toolbox. I have all the cameraparameters from the calibration procedure. When I use a new image notin the calibration set, I can get its transformation equation e.g.Xc=R*X+T, where X is the 3D point of the calibration rig (planar) inthe world frame, and Xc its coordinates in the camera frame. In otherwords, I have everything (both extrinsic and intrinsic parameters).

我想做的是对此图像执行透视校正
我想要删除任何透视图,看到校准钻机
不失真(它的一个棋盘)。

What I want to do is to perform perspective correction on this imagei.e. I want it to remove any perspective and see the calibration rigundistorted (its a checkerboard).

Matlab的新计算机视觉工具箱有一个对象,用于对
图像执行透视变换,给定一个3X3矩阵H.问题是,我不能从已知的内在和外在参数计算这个
矩阵!

Matlab's new Computer Vision toolbox has an object that performs a perspective transformation on animage, given a 3X3 matrix H. The problem is, I can't compute thismatrix from the known intrinsic and extrinsic parameters!

推荐答案

对于所有在这么多个月后仍然感兴趣的人,我已经设法得到正确的单应性矩阵使用Kovesi的代码(),特别是homography2d.m函数。然而,你需要钻机四个角的像素值。如果相机稳定固定,那么您将需要这样做一次。请参阅以下示例代码:

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];

注意,Matlab定义图像中的x轴和行索引和y作为列。因此,必须在方程中交换x-y(正如你可能在上面的代码中看到的)。此外,我已经设法从参数计算单应矩阵,但结果是略微偏离(可能是校准工具箱中的四舍五入误差)。

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.

如果你只想使用相机的参数(也就是不使用Kovesi的代码),那么单应性矩阵是H = KK * Rmat * inv_KK。在这种情况下,代码是

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

这篇关于如何做透视校正在Matlab从已知的内在和外在参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-26 00:30