【问题标题】:Computing camera vectors from image plane using distortions使用失真从图像平面计算相机矢量
【发布时间】:2023-01-29 23:28:35
【问题描述】:

我正在尝试使用相机模型来重建可以用某些相机及其(外在/内在)参数拍摄的图像。这个我没有任何问题。现在我想添加失真,正如OpenCV(似乎是参考模型)中所描述的那样。

目标是为相机网格中的每个像素获取一个矢量,然后我可以使用它来确定它在表面上到达的点(即与相机距离为 1 的平面)。可悲的是,似乎只有另一个方向的函数,在世界上给定一个点,我可以计算图像平面中的对应点。这个方法叫做projectPoints()

这有反函数吗?我似乎找不到一个或不同的可靠方法/python 模块。 先感谢您。

【问题讨论】:

  • 只要将所有点投影到某个公共平面(例如 Z=0 地平面),您就应该能够以其他方式投影。 2D 到 3D 投影仅适用于场景模型(或在简单情况下为地平面)
  • 我也想知道这个。由于相机模型的形状复杂,我无法推导出反函数,必须使用一些迭代方法来估计方向。
  • @fmw42 你是对的,我确实想将这些点投影到一个固定距离的平面上,之后我可以得到(标准化的)向量。我将其添加到问题中,谢谢。

标签: python opencv computer-vision camera camera-calibration


【解决方案1】:

好的, 我读了一点,似乎这个方向根本没有封闭形式的解决方案!我现在通过迭代逼近解决方案来解决它。我只使用 5 个失真系数,但应该可以将其扩展到更多。

这是我使用的代码,速度很快:

def distort(D, coeff, th=10e-7, MAXITER=40):
    undistorted = D
    k1, k2, p1, p2, k3 = coeff
    
    done = True
    i    = 0
    while(done):
        undistorted_old = undistorted
        xn, yn = undistorted
        xn2  = np.square(xn)
        yn2  = np.square(yn)
        r2   = xn2 + yn2
        r4   = np.square(r2)
        r6   = r4 * r2
        xyn2 = 2 * xn * yn
    
        # radial and tangential distortions
        DR = np.tile((1 + k1*r2 + k2*r4 + k3*r6), (2,1))
        DT = np.array([p1*xyn2 + p2*(r2 + 2*xn2), p2*xyn2 + p1*(r2 + 2*yn2)])
        
        # Update
        undistorted = (D-DT) / DR
       
        # calculate error
        error = undistorted_old - undistorted
        if ((np.sum(np.square(error)) < th) or (i==MAXITER)):
            done=False
        i=i+1
    
    return undistorted

希望有帮助!

【讨论】:

    猜你喜欢
    • 2012-03-27
    • 2017-08-13
    • 1970-01-01
    • 2016-06-28
    • 2017-07-25
    • 2016-02-18
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多