对图像应用相对径向畸变函数 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_x
和 map_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.
我有一个径向畸变函数,它以百分比形式给出从 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_x
和 map_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.