4_相机透镜畸变

理论上讲,是可能定义一种透镜而不引入任何畸变的。然而现实世界没有完美的透镜。这主要是制造上的原因,因为制作一个“球形”透镜比制作一个数学上理想的透镜更容易。而且从机械方面也很难把透镜和成像仪保持平行。下面主要描述两种主要的透镜畸变并为他们建模。径向畸变来自于透镜形状,而切向畸变则来自于整个摄像机的组装过程。

径向畸变,实际上摄像机的透镜总是在成像仪的边缘产生显著畸变。

89c589e0b0085d4fe3f6110027749349.png

对径向畸变,成像仪中心(光学中心)的畸变位0,随着向边缘移动,畸变越来越严重。实际情况中,这种畸变比较小,而且可以用r=0的位置周围的泰勒级数展开的前几项来定量描述。对于一般的相机,通常使用前两项,k1和k2;对于畸变很大的相机,比如鱼眼透镜,使用第三项k3。    

2d3a59d6be61cecfdfbf071edb431b49.png

73dc5fe2693575103be3dda4c60d2512.png

切向畸变,这种畸变是由于透镜制造上的缺陷使得透镜本身与图像平面不平行而产生的。可以用p1和p2表示。

7066d00ad0246de1e9ce6418135eceb6.png

因此共有5个我们需要的参数。由于在OpenCV程序中五个参数都是必需的,所以它们被放置到一个畸变向量中,这是一个5×1的矩阵,按顺序依次是k1,k2,p1,p2,k3。下图给出了切向畸变在前面外部矩阵形网格点的影响。这些点明显在位置和半径上有位移。    

14c86eb24bb6a08efd0c1af1e484edad.png

在图像系统中还有很多其他类型的畸变,不过都没有径向和切向畸变显著,故可忽略。

2、标定

知道如何用数学来描述相机的内在参数和畸变后,接下来很自然的问题是如何使用OpenCV来计算内参矩阵和畸变向量。接口:cv::calibrateCamera().对于该接口,

标定方法是把相机对准一个具有很多独立可标识点的已知结构。通过从多个角度观察这个结构,我们可以计算拍摄图像时相机的(相对)位置和方向以及相机的内部参数。为了提供多个视角,需要旋转和平移物体(可参考之前机械臂系列相关内容)。

8_姿态的其他描述及一般坐标系映射

7机器人位姿的数学描述与坐标变

6_机械臂运动学_刚体转动的描述

5_机械臂运动学基础_矩阵

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
桶形畸变校正可以使用透镜畸变模型法来实现。这个模型假设相机畸变是由于透镜形状不完美导致的,并且可以通过一个多项式函数来描述。以下是一个基于Python的实现代码: ```python import numpy as np import cv2 def undistort_image(image, K, D): """ 对图像进行桶形畸变校正 :param image: 原始图像 :param K: 相机内参矩阵 :param D: 畸变系数 :return: 畸变校正后的图像 """ h, w = image.shape[:2] mapx, mapy = cv2.initUndistortRectifyMap(K, D, None, K, (w, h), cv2.CV_32FC1) return cv2.remap(image, mapx, mapy, cv2.INTER_LINEAR) def rectify_image(image_path, K, D): """ 对图像进行桶形畸变校正,并显示结果 :param image_path: 原始图像路径 :param K: 相机内参矩阵 :param D: 畸变系数 """ image = cv2.imread(image_path) undistorted_image = undistort_image(image, K, D) cv2.imshow("Original Image", image) cv2.imshow("Undistorted Image", undistorted_image) cv2.waitKey(0) cv2.destroyAllWindows() if __name__ == '__main__': # 设置相机内参矩阵和畸变系数 K = np.array([[500, 0, 320], [0, 500, 240], [0, 0, 1]]) D = np.array([-0.1, 0.2, -0.05, 0.001, 0]) # 校正图像 rectify_image("test_image.png", K, D) ``` 在这个代码中,我们使用了OpenCV的`initUndistortRectifyMap`函数来计算畸变校正的映射矩阵,然后使用`remap`函数对图像进行校正。在`rectify_image`函数中,我们读取了一张测试图像,并将其畸变校正后显示出来。 请注意,这个代码中的相机内参矩阵和畸变系数是一个示例值,需要根据实际相机参数进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值