消除相机透镜畸变

一般的针孔相机模型如下:

三维坐标点经过透视投影变换,转换到一个图像平面坐标点。


而相机透镜还存在一定的畸变,包括横向畸变和切向畸变。

 

因此,针孔相机模型又被扩展为以下模型:


首先,世界坐标被转换为相机坐标,由X,Y,Z到x,y,z;

然后,归一化,z=1处,x,y的投影坐标x`,y`;

接下来,对投影坐标,进行畸变处理;

最后,由相机坐标转换到图像坐标。

 

在使用广角镜头或鱼眼相机时,原始图像存在畸变比较严重。

在图像识别的很多应用场景中,消除图像的畸变是图像预处理的首要问题。

通过相机标定,很容易拿到相机的内部参数,包括焦距、光心和畸变系数。


以上过程,就是透镜畸变前后图像坐标变换的公式。具体步骤如下:

1. 由图像坐标系反变换到相机坐标系中

2.  然后,校正反变换R-1,一般无校正变换的相机,默认为单位矩阵

3. 归一化,并进行相机透镜畸变处理

4. 由相机坐标转换到图像坐标。

由此,得到由针孔模型到透镜畸变畸变模型相互变换的对应关系u <--> mapx, v <--> mapy

initUndistortRectifyMap函数就是完成了以上工作。

 opencv中,remap与undistortion都是消除畸变的函数,undistortion在设置了一些参数后调用了remap函数,二者的算法实质是一样的。由目标图像的坐标,找到对应的原始图像坐标,然后将其值复制到目标图像。大致思路是如此,由于图像大小和变换,需要插值或近似的方法,如最邻近法、线性插值等

转自:

http://blog.csdn.net/viewcode/article/details/7967253

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值