鱼眼镜头的标定及矫正

OCamCalib: Omnidirectional Camera Calibration Toolbox for Matlab
  本文主要目的是为分享来自苏黎世大学Davide ScaramuzzaOCamCalib全视角相机模型标定矫正算法。作者主页 因为是被墙了,所以我分享出来以供参考。先上结果图:

这里写图片描述

这里写图片描述

可以看出,效果是相当不错的,所以这也是我强烈分享给大家的原因之一。

环境
1. MATLAB2015R标定鱼眼镜头
2. Ubuntu14.04 + OpenCV2.4.11根据标定结果对鱼眼镜头矫正


资源
1. C++鱼眼矫正程序

预备工作
1. 将OCamCalib工具箱添加到Matlab里面,这个方法如果不懂,百度挺多的,这里就不赘述了。
2. 在使用前跟一般的相机矫正方法类似,先拍大约二十张棋盘格,注意每张图必须要拍满所有的角点!一般的原则是,尽可能让每个区域都有棋盘格分布。
3. 将拍好的照片放到工具箱对应的目录下(这里也可以不用如此,只是本人习惯而已)


具体操作步骤

  • 将拍摄好的棋盘格照片放到OCamCalib工具箱目录下

  • 将上述链接地址的工具箱下载本地添加到Matlab工具箱地址,然后运行ocam_calib
    这里写图片描述

  • 加载图片,选择Read names

    1. Basename camera calibration images (without number nor suffix):
      输入你照片的共同的前缀部分

    2. Image format: ([]='r'='ras', 'b'='bmp', 't'='tif', 'g'='gif', 'p'='pgm', 'j'='jpg', 'm'='ppm') >> g
      输入你格式对应的字母,然后就加载好图片了。
      Loading image 1...2...3...4...5...6...7...8...9...10...done
      然后,会显示总共加载到的所有图片
      这里写图片描述

    3. 接下来Extract grid cornes,提取角点。根据提示,依次需要确认需要添加的图片、棋盘格长宽格子数目、格子的长宽尺寸等,这些相信大家看提示应该知道怎么做。

      • 有需要注意的是,这里输入棋盘格x和y方向的小格子数量,这里的计数是从角点以内的方块开始算的。
        Number of squares along the X direction ([]=10) =
        Number of squares along the Y direction ([]=10) =
        看下图,举个栗子:
        这里写图片描述
        上图就是X方向五个方块,Y方向7个方块,这里千万不能弄错,如果弄错了,棋盘格就一个都检测不出来。

      • 输入棋盘格的实际尺寸,单位是毫米(mm)
        Size dX of each square along the X direction ([]=30mm) = 30
        Size dY of each square along the X direction ([]=30mm) = 30

      • 剩下的就是确认中心点等,初阶用户按Entry即可。

      • 下面是正确检测到角点的结果展示
        这是正确检测到角点的图
    4. 矫正 Calibration ,因为是自动检测角点,所以这里就只要简单的等待即可。

    5. 其他的优化结果、显示棋盘格位置、分析误差等功能大家可以尝试,这里我们最重要的是保存标定结果。也就是Save,会在本地生成一个calib_results_fisheye.txt的文件,这就是我们接下来的矫正程序需要用到的。

    6. 将calib_results_fisheye.txt文件拷到undistortFunctions的根目录,然后将你的原始图片也拷到根目录,编译运行即可。原工程没有项目文件,仅有简单的几个cpp、hpp文件,推荐大家用qmake生成一个简单的pro文件即可,需要添加OpenCV的几个库,我用OpenCV2.4.11有效运行。
      以下是我添加的库列表,节约时间就没有一一去查看是否多余了。
      LIBS += /usr/local/lib/libopencv_highgui.so \
      /usr/local/lib/libopencv_core.so \
      /usr/local/lib/libopencv_imgproc.so \
      /usr/local/lib/libopencv_features2d.so \
      /usr/local/lib/libopencv_nonfree.so \
      /usr/local/lib/libopencv_calib3d.so \
      /usr/local/lib/libopencv_video.so \

  • 工具主页
    下载页面


其它

  • 高阶用法就是优化角点误差、人工选取角点等操作,大家有兴趣自己探索,也可以留言讨论。

  • 因为下载页必须设分数,如果没有下载分的可以留言邮箱,我发给你。

  • 本文摘自OCamCalib: Omnidirectional Camera Calibration Toolbox for Matlab,全视相机模型(暂且这样翻译),这不同于一般的径向畸变模型,这种能够对鱼眼大角度相机做更好的还原,之后有时间跟大家探讨下粗浅的内部机理。

PS
1. 觉得本文有帮助的可以左上角点赞,或者留言互动。

  • 30
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 114
    评论
1 2/3维图像分割工具箱 2 PSORT粒子群优化工具箱 3 matlab计量工具箱Lesage 4 MatCont7p1 5 matlab模糊逻辑工具箱函数 6 医学图像处理工具箱 7 人工蜂群工具箱 8 MPT3安装包 9 drEEM toolbox 10 DOMFluor Toolbox v1.7 11 Matlab数学建模工具箱 12 马尔可夫决策过程(MDP)工具箱MDPtoolbox 13 国立SVM工具箱 14 模式识别与机器学习工具箱 15 ttsbox1.1语音合成工具箱 16 分数阶傅里叶变换的程序FRFT 17 魔方模拟器与规划求解 18 隐马尔可夫模型工具箱 HMM 19 图理论工具箱GrTheory 20 自由曲线拟合工具箱ezyfit 21 分形维数计算工具箱FracLab 2.2 22 For-Each 23 PlotPub 24 Sheffield大学最新遗传算法工具箱 25 Camera Calibration 像机标定工具箱 26 Qhull(二维三维三角分解、泰森图)凸包工具箱 2019版 27 jplv7 28 MatlabFns 29 张量工具箱Tensor Toolbox 30 海洋要素计算工具箱seawater 31 地图工具箱m_map 32 othercolor配色工具包 33 Matlab数学建模工具箱 34 元胞自动机 35 量子波函数演示工具箱 36 图像局域特征匹配工具箱 37 图像分割graphcut工具箱 38 NSGA-II工具箱 39 chinamap中国地图数据工具箱(大陆地区) 40 2D GaussFit高斯拟合工具箱 41 dijkstra最小成本路径算法 42 多维数据快速矩阵乘法 43 约束粒子群优化算法 44 脑MRI肿瘤的检测与分类 45 Matlab数值分析算法程序 46 matlab车牌识别完整程序 47 机器人工具箱robot-10.3.1 48 cvx凸优化处理工具箱 49 hctsa时间序列分析工具箱 50 神经科学工具箱Psychtoolbox-3-PTB 51 地震数据处理工具CREWES1990版 52 经济最优化工具箱CompEcon 53 基于约束的重构分析工具箱Cobratoolbox 54 Schwarz-Christoffel Toolbox 55 Gibbs-SeaWater (GSW)海洋学工具箱 56 光声仿真工具箱K-Wave-toolbox-1.2.1 57 语音处理工具箱Sap-Voicebox 58 贝叶斯网工具箱Bayes Net Toolbox(BNT) 59 计算机视觉工具箱VFfeat-0.9.21 60 全向相机校准工具箱OCamCalib_v3.0 61 心理物理学数据分析工具箱Palamedes1_10_3 62 生理学研究工具箱EEGLAB 63 磁共振成像处理工具箱CONN 18b 64 matlab 复杂网络工具箱 65 聚类分析工具箱FuzzyClusteringToolbox 66 遗传规划matlab工具箱 67 粒子群优化工具箱 68 数字图像处理工具箱DIPUM Toolbax V1.1.3 69 遗传算法工具箱 70 鱼群算法工具箱OptimizedAFSAr 71 蚁群算法工具箱 72 matlab优化工具箱 73 数据包络分析工具箱 74 图像分割质量评估工具包 75 相关向量机工具箱 76 音频处理工具箱 77 nurbs工具箱 78 Nurbs-surface工具箱 79 grabit数据提取工具箱 80 量子信息工具箱QLib 81 DYNAMO工具箱 82 NEDC循环的整车油耗量 83 PlotHub工具箱 84 MvCAT_Ver02.01 85 Regularization Tools Version 4.1 86 MatrixVB 4.5(含注册) 87 空间几何工具箱 matGeom-1.2.2 88 大数计算工具箱 VariablePrecisionIntegers 89 晶体织构分析工具包 mtex-5.7.0 90 Minimal Paths 2工具箱 91 Matlab数学建模工具箱
鱼眼镜头标定是为了消除鱼眼镜头的畸变效应,使图像更加真实且准确。在Python中,可以使用OpenCV库进行鱼眼镜头标定。 下面是一个简单的鱼眼镜头标定的Python代码示例: ```python import cv2 import numpy as np def calibrate_fisheye(images, pattern_size): criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) obj_points = [] img_points = [] objp = np.zeros((1, pattern_size[0] * pattern_size[1], 3), np.float32) objp[0,:,:2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2) for img in images: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, corners = cv2.findChessboardCorners(gray, pattern_size, None) if ret: obj_points.append(objp) corners2 = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1), criteria) img_points.append(corners2) K = np.zeros((3, 3)) D = np.zeros((4, 1)) flags = cv2.fisheye.CALIB_RECOMPUTE_EXTRINSIC + cv2.fisheye.CALIB_CHECK_COND + cv2.fisheye.CALIB_FIX_SKEW rms, _, _, _, _ = cv2.fisheye.calibrate(obj_points, img_points, gray.shape[::-1], K, D, flags=flags) return K, D, rms # 读取鱼眼图像 images = [] image_paths = ['image1.jpg', 'image2.jpg', 'image3.jpg'] # 替换为你自己的图像路径 for path in image_paths: img = cv2.imread(path) images.append(img) # 设置棋盘格大小 pattern_size = (9, 6) # 替换为你自己棋盘格的行和列数 # 进行标定 K, D, rms = calibrate_fisheye(images, pattern_size) print("K matrix:\n", K) print("D coefficients:\n", D) print("RMS error:", rms) ``` 在这个示例代码中,首先定义了一个 `calibrate_fisheye` 函数,用于进行鱼眼镜头标定。然后,通过调用 `findChessboardCorners` 找到棋盘格的角点,并使用 `cornerSubPix` 进一步优化角点位置。接下来,通过调用 `fisheye.calibrate` 函数进行鱼眼镜头标定,得到内参矩阵 `K` 和畸变系数 `D`。最后,打印出内参矩阵 `K` 和畸变系数 `D`,以及标定的均方根误差。 请注意,这只是一个简单的鱼眼镜头标定示例,实际应用中可能需要根据具体情况进行参数的调整和优化。同时,为了获得更好的标定结果,建议使用多张图像进行标定,并保证这些图像中包含有棋盘格。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值