在不知道相机的任何信息的情况下,对图像应用相对径向畸变函数



我有一个径向失真函数,它给了我从0(图像中心)到相对完整图像字段(字段高度1)的相对失真百分比。例如,在完整的相对场高为1时,这个函数会给我一个高达5%的失真。

我试图将此与opencv undistortion function一起使用应用失真,但不知道如何填充矩阵。

如前所述,我只有一个源图像,不知道任何关于相机的参数,如焦距,除了我知道畸变功能。

如何在cv2中设置矩阵。undistortion (src_image, matrix,…)?

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

在下面我假设你的扭曲纯粹是径向的。如果您已经将其分解为(x, y),则适用类似的考虑。

就得到了像素(x, y)到图像中心(x_c, y_c)的距离r = sqrt((x - x_c)^2 + (y - y_c)^2)的畸变函数d(r)。该函数表示畸变图像中像素半径r_d相对于未畸变图像r:(r_d - r) / r = d(r),或等价的r_d = r * (1 - d(r))的相对变化。

如果给定一个扭曲的图像,并且想要消除扭曲,您需要反转上面的方程(即解析或数值求解),在感兴趣的范围内为每个r_d找到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。

相关内容