在失真的图像上使用失真系数使失真不失真

时间:2019-02-08 15:26:45

标签: opencv computer-vision

给出由径向和切向畸变定义的针孔模型的畸变系数 D = k1,k2,p1,p2,k3 。 如何通过这些系数使图像失真? 我知道 cv2.undistort()函数。谁能解释我如何实现不失真功能来执行迭代最小化?

    # TODO: Iterative minimization required
    r2 = x_ * x_ + y_ * y_
    # Remove tangential distortion
    x_tangential = x_ - (2 * distort_coeffs[2] * x_ * y_ + distort_coeffs[3] * (r2 + 2 * x_ * x_))
    y_tangential = y_ - (distort_coeffs[2] * (r2 + 2 * y_ * y_) + 2 * distort_coeffs[3] * x_ * y_)
    # Remove radial distortion
    x = x_tangential / (1 + distort_coeffs[0] * r2 + distort_coeffs[1] * r2 * r2 + distort_coeffs[4] * r2 * r2 * r2)
    y = y_tangential / (1 + distort_coeffs[0] * r2 + distort_coeffs[1] * r2 * r2 + distort_coeffs[4] * r2 * r2 * r2)

    cam_coords_undistorted = torch.cat([x, y, ones], 1)

1 个答案:

答案 0 :(得分:0)

有两种情况:

  1. 变形完全是径向的(切向系数p1,p2 = 0)。问题归结为求解奇数级的多项式方程,并且您需要最小的正和实数解。任何方程式求解器算法都可以使用,伴随方法是常见的选择。特别是对于纯径向,单参数畸变,您可以得到一个三次方程,可以使用卡尔达诺公式来解析求解。
  2. 一般情况下,失真方程是耦合的,您需要求解两个耦合的多项式方程的实际系统。您可能会提出这样的问题,即最大程度地减少给定的临时解决方案的残差之一,但是对于此特定的方程组,有一个捷径可用:解决方案是由失真函数本身引起的递归的固定点。有关说明,请参见Heikkila的旧paper中的公式(8)。 OpenCV代码大致基于此代码。