利用OpenCV3进行鱼眼镜头标定
转自:http://www.cnblogs.com/kooo/articles/3987201.html
利用OpenCV3进行鱼眼镜头标定
OpenCV3.0 alpha在8月21日发布,其中增加了鱼眼镜头模型,提供了标定、去畸变等一系列api,其实现方法参考了{Camera Calibration Toolbox for Matlab}。本文简单介绍了OpenCV 中实现的鱼眼镜头模型,给出调用demo的关键代码、注释和去畸变的结果。
鱼眼镜头模型
鱼眼镜头的内参模型可以表示为,与普通镜头的内参一样,但畸变参数不同,为,含义如下:
设(X,Y,Z)为一个三维坐标点,投影在图像上的二维坐标为(u,v),如果不考虑畸变,投影关系如下:
R和t分别代表相机外参中的旋转矩阵和平移向量。
当考虑鱼眼镜头的畸变后,投影关系转化为:
标定流程
首先调用OpenCV的FindChessboardCorners()来寻找图像上的标定板的角点,再根据标定板的尺寸指定这些角点对应的三维点的三维坐标,再调用fisheye::calibrate()来进行标定,利用标定结果中的内参和畸变参数调用fisheye::undistortImage()对图像做去畸变操作。
代码片段
tuple<Mat, Mat, double> calibrate_fisheye(const vector<Mat>& images, const Settings& s) {/*寻找二维角点*/auto corners = chessboard_corners(images, s);/*计算二维角点对应的三维点坐标*/auto object_points = vector<vector<Point3d>>(corners.size(), object_positions(s));cv::Matx33d K;cv::Vec4d D;int flag = 0;flag |= cv::fisheye::CALIB_RECOMPUTE_EXTRINSIC;flag |= cv::fisheye::CALIB_CHECK_COND;flag |= cv::fisheye::CALIB_FIX_SKEW;/*非常重要*/double rms = fisheye::calibrate(object_points, corners, s.imageSize,K, D, cv::noArray(), cv::noArray(), flag, cv::TermCriteria(3, 20, 1e-6));return make_tuple(Mat(K), Mat(D), rms); }
代码非常简单,和标定普通的镜头的区别在于:
- 角点坐标和和对应的三维点坐标为double类型,普通镜头为float类型,弄混后不能正确执行
- flag必须指定CALIB_FIX_SKEW,代表求解时假设内参中fx=fy,与鱼眼镜头标定论文中一致,没有这个假设的话是得不到结果的
结果
测试了OpenCV的测试数据,34张图像进行标定,重投影误差均值为0.343542。
左边为源图像,右边为去畸变结果:
未完成工作
本来以为在畸变图像上找棋盘格角点会比一般的方法复杂一些,没想到利用FindChessboardCorners就可以成功找到,所以就暂时这样用了,对于畸变比较大的图像,或者手工标出角点,或者实现论文《Automatic Detection of Checkerboards on Blurred and Distorted Images》中自动提取棋盘格的方法。
参考:
http://docs.opencv.org/master/modules/calib3d/doc/calib3d.html
利用OpenCV3进行鱼眼镜头标定相关推荐
- 鱼眼镜头标定基本原理及实现
原文首发于微信公众号--3D视觉工坊:一分钟详解鱼眼镜头标定基本原理及实现 前言 在VSLAM中,经常会使用鱼眼镜头或者广角镜头.本文主要分为理论部分与鱼眼镜头标定实践两部分,其中理论部分,主要参考& ...
- 一分钟详解鱼眼镜头标定基本原理及实现
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 3D视觉工坊的第61篇文章 前言 在VSLAM中,经常会使用鱼眼镜头或者广角镜头.本文主要分为理论部分 ...
- EPSON 利用CCD图像处理包标定工具坐标系
EPSON 利用CCD图像处理包标定工具坐标系 仰视式安装的相机可以用来计算工具偏移,下例使用仰视式相机来计算工具偏移.该功能首先运行一个序列来定位工具的尖端.然后计算出工具偏移(前提是CCD已标定) ...
- 利用棋盘格进行相机标定
利用棋盘格进行相机标定 前言 一.为什么要进行相机标定? 简单来说,相机标定的目的主要就是通过构建方程来求解相机内参数,相机的内参数包括Fx,Fy,Cx,Cy以及畸变参数.通过求解得到相机的内参数可以 ...
- 鱼眼:一:一分钟详解鱼眼镜头标定基本原理及实现
目录 一.目的 1.想知道:一分钟详解鱼眼镜头标定基本原理及实现 1.将其转载,避免作者删除,就没有了 二.参考 1.一分钟详解鱼眼镜头标定基本原理及实现 三.注意 四.操作:备份原文 前言 一 理论 ...
- python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码 一.前言 今天的低价单孔摄像机(照相机)会给图像带来很多畸变.畸变主要有两 种:径向畸变和切想畸变.如下图所示,用 ...
- 相机模型-鱼眼模型/鱼眼镜头标定基本原理及实现(2)
问题: 1 广角/超广角与鱼眼摄像机,角度界限 2 畸变模型中radtan畸变模型与鱼眼畸变模型在小于150范围是否都时能适用. (同数据,拟合模型不同,,参数结果不同,不欠拟合和过拟合就可) 3 ...
- 利用Matlab进行相机标定并使用openCV进行简单三维重建
注:本文主要针对Matlab和OpenCV跨平台进行相机标定.单相机三维重建工作的实现,因为我发现网上竟然没有一篇博客径直指出这两者在进行图像处理时的巨大差异(坐标系完全不同),不然我也不会走了很多弯 ...
- 学习OpenCV3 面阵相机标定方法
使用OpenCV实现张正友法相机标定之前,有几个问题事先要确认一下,那就是相机为什么需要标定,标定需要的输入和输出分别是哪些? 相机标定的目的:获取摄像机的内参和外参矩阵(同时也会得到每一幅标定图像的 ...
- halocn标定找旋转中心_一种利用旋转中心进行手眼标定的原理性介绍
首先,我们要了解一下常规的手眼标定流程是怎么样的. (一)如果吸嘴中心就是法兰盘的中心则 是下面这样的:按九宫格走九个点,取得九组吸嘴的像素坐标与法兰盘的机械坐标 (图1) 进行标定 (二)如果吸嘴位 ...
最新文章
- Js时间格式[转载]
- 「思想钢印」成真!33位中美科学家最新成果:用光成功改变大脑认知
- 在ListCtrl控件中插入图标
- log4net简单配置打印日志
- java中的controller_详解Spring Boot中Controller用法
- Python pip切换为国内镜像源(亲测可用)
- Spring Security——获取当前已登录用户UserDetails对象
- 定位pure virtual method called问题
- SQLSERVER的视图、函数、存储过程、触发器
- proj编译linux,在Ubuntu上安装proj 投影转换程序
- Spring-Boot开发者工具:自动重启、LiveReload、远程开发
- java 定时任务表达式(网络总结)
- CSS设置div上下居中
- RAR文件格式学习(了解)
- 2台路由器串联接法(有线路由+无线路由)
- 浅析原代细胞应用现状
- 辽宁丰睿佳业:抖音店铺选品注意事项有哪些?
- python代码书写_如何优雅的书写Python代码, python使用小技巧
- 码元速率、数据速率、信道带宽、信道容量、载波的概念
- android待机动画,Android 忆童年 DVD机待机 loading 动画
热门文章
- libevent源码分析系列
- MySQL 开启慢查询日志
- maven私服搭建:docker安装Sonatype Nexus以及寻找admin用户对应的随机初始密码
- python自动发邮件mysql_python自动化六--操作mysql,redis,发送邮件,EXCEL,MD5加密
- lnmp mysql 命令_LNMP状态管理命令
- 短信平台建设方案_五大垂直行业工业互联网平台建设方案
- 递归下降分析器 c++_专业围观质谱:汇总常见质谱仪专业对比分析!质量分析器直白解剖让你秒懂!...
- html5 切换语言,Vue项目中使用国际化, 并配置动态切换语言的方法
- linux内核中led驱动的分布,Linux内核模块驱动之---led驱动
- 风压和功率计算公式轴流式_这是你见过最全的风机计算公式