偶然查这个问题,发现仍然能查到一大票错误的信息,虽然不能说故意误导,但是还是很影响新手学习,所以重新简单复习一下,“以正视听”!
看到一个关于去畸变的比较靠前csdn博客说K1大于0是桶形畸变。
高翔的slam14讲也出现视频课件和书公式用反的情况,一会xcorrected=x(1+k^2),一会xdistorted=x(1+k^2)。
第一个博客我找不到了,第二个高翔的b站视频还有,说左边是xcorrected
随便一搜中文网络,到处都是错的:下文也是说x'是校正后的
不搜不知道,我越来越找不到最开始看到的错误了,但是越找越多,这种不动脑子抄的答案真的是一搜一大把,全都是反的。
=====================================================================================================================
当然,单说一个K1的正负,本身意义不大,取决于你的映射方向和你的函数怎么写。但问题是,接口是统一的,内参是统一的,在同一套体系下不可能有两个方向的映射,你调去畸变接口还要跟人家对一下映射是正还是反吗?那么一定有一个固定的方向,也会有固定的畸变写法。
我们去查一下opencv官网:左边是畸变坐标,而不是校正后的坐标,我又查了更多网站,和opencv保持统一。
更多英文网保持统一。
========================================================================
一个简单实验,思路如下,使用opencv的去畸变接口,让K1分别大于0和小于0,K1小于0,“去畸变”后会变的更“枕”,说明K1小于0对应的是桶形畸变;反之,K1大于0,“去畸变”后变得更“桶”,说明K1大于0是枕形畸变。
手动虚拟了一个绝对值比较大的K1=-0.9
import cv2
import numpy as np
img = cv2.imread('/home/hqw/DOM_WS/calibration_ws/Cam1_80mm_small/000001.jpg')
cameraMatrix = np.array([[4256.285003513053, 0.00000000e+00, 3055.734559863916],
[0.00000000e+00, 4228.537640373734, 1982.949879382805],
[0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])
distCoeffs = np.array([-0.9, 0.08519733266449879, 0.0002846649951554347, 0.0006173954394454957, -0.01713882649825566])
undistorted = cv2.undistort(img, cameraMatrix, distCoeffs)
cv2.namedWindow("Undistorted", cv2.WINDOW_NORMAL)
cv2.imshow("Undistorted", undistorted)
cv2.resizeWindow("Undistorted", 640, 480)
cv2.waitKey(0)
cv2.destroyAllWindows()
再手动虚拟一个绝对值比较大的K1=0.9
import cv2
import numpy as np
img = cv2.imread('/home/hqw/DOM_WS/calibration_ws/Cam1_80mm_small/000001.jpg')
cameraMatrix = np.array([[4256.285003513053, 0.00000000e+00, 3055.734559863916],
[0.00000000e+00, 4228.537640373734, 1982.949879382805],
[0.00000000e+00, 0.00000000e+00, 1.00000000e+00]])
distCoeffs = np.array([0.9, 0.08519733266449879, 0.0002846649951554347, 0.0006173954394454957, -0.01713882649825566])
undistorted = cv2.undistort(img, cameraMatrix, distCoeffs)
cv2.namedWindow("Undistorted", cv2.WINDOW_NORMAL)
cv2.imshow("Undistorted", undistorted)
cv2.resizeWindow("Undistorted", 640, 480)
cv2.waitKey(0)
cv2.destroyAllWindows()
总结:最常见的畸变应该是桶形畸变,因为都是凸透镜成像。最常见的K都是偏负数(在本实验中,简化了模型,忽略或者降低K2和K3,将K1调大,实际上,因为K2和K3对应的是r^4,r^6,所以可能K3大概率是负数)。
两组参数,K1不变,K3变-0.1,影响更大
distCoeffs = np.array([0.01, 0.0, 0.00, 0.00, 0)
distCoeffs = np.array([0.01, 0.0, 0.00, 0.00, -0.1])
前者去畸变后变得更桶(原来是枕形畸变),后者更枕(原来是桶形畸变)。
查到一个有意思的东西,可以直接拉参数条调整畸变,直观展现相机内参的变化和影响,git