全(中文)网都错的相机畸变参数到底怎么写?——相机畸变校正公式的正确写法

偶然查这个问题,发现仍然能查到一大票错误的信息,虽然不能说故意误导,但是还是很影响新手学习,所以重新简单复习一下,“以正视听”!

看到一个关于去畸变的比较靠前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

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值