我有一个径向失真函数,它给了我从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_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。