对图像应用相对径向畸变函数 w/o 对相机一无所知

Apply relative radial distortion function to image w/o knowing anything about the camera

我有一个径向畸变函数,它以百分比形式给出从 0(图像中心)到相对全图像场(场高 1)的相对畸变。例如,此函数会给我在 1 的完整相对场高下高达 5% 的失真。

我尝试将它与 opencv undistort 函数一起使用来应用 失真,但不知道如何填充矩阵。

如前所述,我只有源图像,对焦距等相机参数一无所知,除了我知道畸变函数。

我应该如何在 cv2.undistort(src_image, matrix, ...) 中设置矩阵?

在您的情况下更容易使用的 OpenCv 例程是 cv::remap,而不是 undistort。

在下文中,我假设您的畸变是纯径向的。如果你已经在 (x, y) 中分解了它,类似的考虑也适用。

所以你有一个畸变函数 d(r) 到图像中心 (x_c, y_c) 的像素 (x, y) 的距离 r = sqrt((x - x_c)^2 + (y - y_c)^2)。该函数表示失真图像中像素半径 r_d 相对于未失真图像 r 的相对变化:(r_d - r) / r = d(r),或者等效地,r_d = r * (1 - d(r)).

如果给你一张扭曲的图像,并且想要消除扭曲,你需要将上面的等式反转(即解析或数值求解),找到每个 [=14] 的 r 的值=] 在感兴趣的范围内。然后,您可以简单地创建两个数组,map_xmap_y,它们表示从失真坐标到未失真坐标的映射:对于失真图像中给定的一对 (x_d, y_d) 整数像素坐标,您可以计算关联的 r_d = sqrt(((x_d - x_c)^2 + (y_d - y_c)^2),然后相应的 r 作为 r_d 的函数从求解方程,返回到 (x, y),并分配 map_x[y_d, x_d] = x; map_y[y_d, x_d] = y。最后,将它们传递给 cv::remap.