代码之家  ›  专栏  ›  技术社区  ›  Hein Wessels

OpenCV-投影点的镜头失真系数是否反转?

  •  1
  • Hein Wessels  · 技术社区  · 6 年前

    大家好,

    calibrateCamera ),并查看是否获得了相同的系数。

    我的问题 projectPoints 需要的功能 distCoeffs 作为输入。这些系数是否与必须用于 图像(输出 校准照相机 )? 这意味着函数必须计算该运算的逆运算。或者,它是否使用这些系数直接扭曲对象点?这意味着在输出时,例如。 .

    我用来模拟图像的最小工作代码(在Python中):

    # The distortion matrix that I vary
    distortion = np.array([0.3, 0.001, 0.0, 0.0, 0.01])
    
    # Generate Grid of Object Points
    grid_size, square_size = [20, 20], 0.2
    object_points = np.zeros([grid_size[0] * grid_size[1], 3])
    mx, my = [(grid_size[0] - 1) * square_size / 2, (grid_size[1] - 1) * square_size / 2]
    for i in range(grid_size[0]):
        for j in range(grid_size[1]):
            object_points[i * grid_size[0] + j] = [i * square_size - mx, j * square_size - my, 0]
    
    # Setup the camera information
    f, p = [5e-3, 120e-8]
    intrinsic = np.array([[f/p, 0, 0], [0, f/p, 0], [0, 0, 1]])
    rvec = np.array([0.0, 0.0, 0.0])
    tvec = np.array([0.0, 0.0, 3.0])
    
    # Project the points
    image_points, jacobian = cv2.projectPoints(object_points, rvec, tvec, intrinsic, distortion)
    
    # Plot the points (using PyPlot)
    plt.scatter(*zip(*image_points[:, 0, :]), marker='.')
    plt.axis('equal')
    plt.xlim((-4000, 4000))
    plt.ylim((-4000, 4000))
    plt.grid()
    plt.show()
    

    附加说明:

    this 网站,其中说明:

    为了测试这个我用了 积极的 失真矩阵(如上面的代码所示),它产生了枕形失真。

    distortion = np.array([0.3, 0.001, 0.0, 0.0, 0.01])
    

    Expected Barrel Distortion, but got Pincushion

    在这幅图中,我清楚地创建了枕形失真,而不是桶形失真。

    同样,如果我把我的失真系数 消极的 ,这将导致枕形失真,我得到以下结果:

    distortion = -np.array([0.3, 0.001, 0.0, 0.0, 0.01])
    

    Expected Pincushion distortion, got barrel distortion

    这是否意味着如果使用 功能?

    谢谢你的帮助!

    1 回复  |  直到 6 年前
        1
  •  1
  •   Hein Wessels    6 年前

    看来 distCoeffs 在里面 projectPoints 是同一类型的 calibrateCamera 项目点 ,它给了我 失真矩阵。

    E、 g带有以下代码

    distortion_given = np.array([[0.2, 0.01,  0.0, 0.0, 0.01]])# Note the negative sign
    ... = projectPoints(... , distortion_given , ...)
    ... , distortion_estimated , ... = calibrateCamera (...)
    print (distortion_given)
    print (distortion_estimated)
    

    enter image description here

    结果是:

    distortion_given = [[-0.2, -0.01,  0.0, 0.0, -0.01]]
    distortion_estimated = [[-0.19999985 -0.01000031  0.          0.         -0.00999981]]
    

    这意味着当 this 我在问题中提到的网站应该更加强调这个词 通常

    筒形畸变(通常为k_1>0)和枕形畸变(通常为k_1<0)。