【问题标题】:How can I undistort an image in Matlab using the known camera parameters?如何使用已知的相机参数在 Matlab 中使图像不失真?
【发布时间】:2012-08-20 12:21:55
【问题描述】:

这在OpenCV 中很容易做到,但是我想要一个相当高效且可以轻松更改的原生 Matlab 实现。该方法应该能够采用上述链接中指定的相机参数。

【问题讨论】:

    标签: matlab computer-vision camera-calibration matlab-cvst


    【解决方案1】:

    最简单、最常见的不失真(也称为 unwarp 或补偿镜头失真)方法是对选定的输出照片尺寸进行正向失真,然后使用双线性插值进行反向映射。

    这是我为执行此操作而编写的代码:

    function I = undistort(Idistorted, params)
    fx = params.fx;
    fy = params.fy;
    cx = params.cx;
    cy = params.cy;
    k1 = params.k1;
    k2 = params.k2;
    k3 = params.k3;
    p1 = params.p1;
    p2 = params.p2;
    
    K = [fx 0 cx; 0 fy cy; 0 0 1];
    
    I = zeros(size(Idistorted));
    [i j] = find(~isnan(I));
    
    % Xp = the xyz vals of points on the z plane
    Xp = inv(K)*[j i ones(length(i),1)]';
    
    % Now we calculate how those points distort i.e forward map them through the distortion
    r2 = Xp(1,:).^2+Xp(2,:).^2;
    x = Xp(1,:);
    y = Xp(2,:);
    
    x = x.*(1+k1*r2 + k2*r2.^2) + 2*p1.*x.*y + p2*(r2 + 2*x.^2);
    y = y.*(1+k1*r2 + k2*r2.^2) + 2*p2.*x.*y + p1*(r2 + 2*y.^2);
    
    % u and v are now the distorted cooridnates
    u = reshape(fx*x + cx,size(I));
    v = reshape(fy*y + cy,size(I));
    
    % Now we perform a backward mapping in order to undistort the warped image coordinates
    I = interp2(Idistorted, u, v);
    

    要使用它,需要知道正在使用的相机的相机参数。 我目前正在使用 PMD CamboardNano,根据 Cayim.com 论坛的说法,这里使用的参数如下:

    params = struct('fx',104.119, 'fy', 103.588, 'cx', 81.9494, 'cy', 59.4392, 'k1', -0.222609, 'k2', 0.063022, 'k3', 0, 'p1', 0.002865, 'p2', -0.001446);
    
    I = undistort(Idistorted, params);
    
    subplot(121); imagesc(Idistorted);
    subplot(122); imagesc(I);
    

    这是 Camboard Nano 的输出示例。注意:我人为地添加了边界线,以查看靠近边缘的失真的效果(它更加明显):

    【讨论】:

    • 你的函数支持哪些数据类型?我无法让它与我尝试过的任何东西一起工作......顺便说一句:感谢这个功能,奇怪的是 matlab 没有实现这个
    • @AnderBiguri 它至少应该适用于单通道类型“双”。首先要做的是将任何图像转换为双倍。此外,如果您有一个灰度图像或其深度图像,那么它应该可以正常工作,只需使用正确的参数调用 undistort。如果您有 3 通道彩色图像,则需要在每个通道上分别进行不失真。
    • 它不适用于灰度位图,但我会将它们转换为双倍并尝试!
    【解决方案2】:

    您现在可以使用计算机视觉系统工具箱从 R2013B 版本开始执行此操作。有一个名为Camera Calibrator 的GUI 应用程序和一个函数undistortImage

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 2023-01-29
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      相关资源
      最近更新 更多