作者:Kaustubh Sadekar       Satya Mallick翻译:陈之炎
校对:王可汗本文约3200字,建议阅读5分钟
本文为大家系统地介绍了使用OpenCV实现摄像头标定。

标签:摄像头,标定

摄像头是一种视觉传感器,它已经成为了机器人技术、监控、空间探索、社交媒体、工业自动化,甚至娱乐业等多个领域不可分割的组成部分。

在摄像头的多种应用中,了解摄像头的参数对于视觉传感器的有效使用至关重要。

在本文中,将阐述摄像头标定所涉及的步骤及其涵义。

此外,文中还共享了棋盘格模式示例图像的C++和Python代码。

什么是摄像头标定?

对摄像头参数进行估计的过程称为摄像头标定。

通过摄像头标定,可以掌握摄像头的所有信息(参数或系数),从而可以确定现实世界中的三维点与摄像头捕获图像的二维投影(像素)之间的精确关系。

通常,摄像头标定意味着恢复以下两类参数:

1. 摄像头 /镜头系统的固有参数。如:镜头的焦距、光心和径向失真系数等参数。

2. 外部参数:这是指摄像头相对于某个世界坐标系的方向(旋转矩阵R和平移向量t)。

在下图中,采用了几何标定来估计透镜的参数,从而消除图像的失真。

对失真图像采用几何标定之后的效果


使用OpenCV实现摄像头标定

为了更好地理解整个标定过程,首先需要了解成像的几何特征。点击下面的链接来查看详细的解释。

成像的几何特征

正如前文所述,为了找出一个三维点在图像平面上的投影,首先需要使用外部参数(旋转矩阵R和平移向量t)将该点从世界坐标系转换到摄像头坐标系

接下来,利用摄像头的固有参数,将该点投影到图像平面上。

将世界坐标中的三维点(Xw, YW,Zw)投影到图像坐标 (u、v)的关联方程如下所示:

其中,P是一个由两部分组成的3×4投影矩阵——包含固有参数的固有矩阵(K)、由3×3旋转矩阵R和3×1平移向量t组合而成的外部矩阵([R|t])。

如前文所述,固有矩阵是上三角矩阵

其中

fx,fy是x和y的焦距(通常二者是相同的)。

cx,cy是图像平面上光心的x、 y坐标,这一坐标通常用图像的中心来近似。

γ是各轴之间的斜度,通常为0。

摄像头标定的目的

摄像头标定的目的是:利用一组已知的3D点坐标(Xw, YW,Zw)及其相应的图像坐标(u、v)来找出3×3矩阵K、3×3旋转矩阵R和3×1平移向量t。当得出固有参数和外部参数的值之后,便实现了摄像头标定。

总之,摄像头标定算法应具备以下输入和输出:

1. 输入:已知二维图像坐标和三维世界坐标点的图像集合。

2. 输出:3×3摄像头固有矩阵,每幅图像的旋转矩阵和平移向量。

注:在OpenCV中,摄像头固有矩阵没有倾斜参数,所以该矩阵的形式为

多种类型的摄像头标定方法

有以下几种摄像头标定方法:

1. 模式标定:当能完全控制成像过程时,执行标定的最佳方法是从不同的角度捕捉一个物体或已知维度模式的多幅图像。本文中涉及到的基于棋盘格的方法属于这种标定。也可以使用已知尺寸的圆形模式来替代棋盘格模式。

2. 几何线索:有时场景中有如直线和消失点等其他的几何线索,可以利用于这些几何线索来进行标定。

3. 基于深度学习的标定:当对成像设置的控制很少时(例如:当只有一个场景的单一图像),可使用基于深度学习的方法获得摄像头的标定信息。


摄像头标定的步骤

标定过程的步骤可用下图中的流程图来解释。

下面,来看看这些步骤是如何实现的:

第1步:用棋盘格模式定义真实世界的坐标

世界坐标系:世界坐标系由附在房间里一面墙上的棋盘格图案来固定,三维点是棋盘格中正方形的拐角。上述棋盘格中的任何一个角都可以定为世界坐标系的原点。XW轴和YW轴沿墙移动,ZW轴垂直于墙移动。因此,棋盘格上的所有点都在XY平面上(即ZW=0)。

在标定过程中,通过一组已知的三维点(Xw, YW,Zw)及其在图像中相应的像素位置(u,v)来计算出摄像头的参数。

对于3D点,可以在许多不同的方向上拍摄一个已知尺寸的棋盘格图案。将世界坐标映射到棋盘格上,由于所有的角点都在一个平面上,可以任意选取ZW为0。由于各点在棋盘格中是等间隔的,可以将其中一个点设为参考点(0,0),这样,便很容易定义出每个三维点的坐标(XW,YW)。

为什么棋盘格图案在摄像头标定中应用如此之广?

棋盘格图案的独特之处是:在图像检测过程中,它很容易检测到。不仅如此,棋盘格上的正方形是定位的理想选择,因为它们在两个方向的梯度比较尖锐。此外,这些方格与它们在棋盘线的交叉点有关。所有这些特点,都有利于方便地定位出正方形的拐角。

绘制出检测到的棋盘板拐角坐标后的结果图

第2步:从多个不同的角度捕捉多个棋盘格图像

上述图像用于标定摄像头。

接下来,确保棋盘格为静态,并通过移动摄像头拍摄出多幅棋盘图像。

或者,也可以保持摄像头不动,拍摄不同方向的棋盘格图案,从数学的角度来看,这两种情况很类似。

第3步:找出棋盘格板的二维坐标

有了多幅棋盘格图像之后,世界坐标系上棋盘格上点的三维位置也已知,最后,需要找出的是图像在棋盘格上二维像素的位置。

3.1找出棋盘格的角

OpenCV提供了一个名为findChessboardCorners的内置函数,利用这个函数可以找出棋盘格中各个角的坐标。下面,来看看这一代码的用法:

C++

Python

其中:

根据是否检测到一个棋盘格模式,输出为真或假。

3.2调整棋盘格的角

良好的标定应完全满足精度的要求。为了获得良好的结果,应对各个角的位置进行调整,以获得亚像素级的精度。

OpenCV有一个 cornerSubPix函数,利用这个函数获取原始图像和棋盘格角的位置,并在原始位置的小范围内找出最佳的位置角度。该算法的本质是一个迭代过程,为此需要指定终止条件(如,迭代次数和/或精度)

C++

Python

其中

第4步:标定摄像头

摄像头标定的最后一步是:将世界坐标中的三维点及其在所有图像的二维位置传递给OpenCV的calibrateCamera 方法。这是基于张正友的一篇论文。数学上有点复杂,需要线性代数的背景知识。

来看看calibrateCamera方法的语法

C++

Python

其中

摄像头标定源代码

摄像头标定的Python和C++代码如下。利用下面的链接,下载所有的图像和代码则更为简单。

摄像头标定的Python代码

请仔细阅读代码的注释,它们对每一步都在做什么作了详细解释。

C++ 源代码

请通读每一条注释,以了解每一步都实现了什么。

往期回顾:

独家|OpenCV 1.1 Mat - 基本图像容器(附链接)

独家|OpenCV 1.2 如何用OpenCV扫描图像、查找表和测量时间(附链接)

独家|OpenCV 1.3 矩阵的掩膜操作(附链接)

独家|OpenCV 1.4 对图像的操作

独家|OpenCV 1.5 利用OpenCV叠加(混合)两幅图像

独家|OpenCV 1.6 改变图像的对比度和亮度!

独家|OpenCV 1.7 离散傅里叶变换

独家|OpenCV 1.8 使用XML和YAML文件实现文件的输入/输出

独家|OpenCV 1.9 如何利用OpenCV的parallel_for_并行化代码(附代码)

编辑:于腾凯

校对:汪雨晴

译者简介

陈之炎,北京交通大学通信与控制工程专业毕业,获得工学硕士学位,历任长城计算机软件与系统公司工程师,大唐微电子公司工程师,现任北京吾译超群科技有限公司技术支持。目前从事智能化翻译教学系统的运营和维护,在人工智能深度学习和自然语言处理(NLP)方面积累有一定的经验。业余时间喜爱翻译创作,翻译作品主要有:IEC-ISO 7816、伊拉克石油工程项目、新财税主义宣言等等,其中中译英作品“新财税主义宣言”在GLOBAL TIMES正式发表。能够利用业余时间加入到THU 数据派平台的翻译志愿者小组,希望能和大家一起交流分享,共同进步

翻译组招募信息

工作内容:需要一颗细致的心,将选取好的外文文章翻译成流畅的中文。如果你是数据科学/统计学/计算机类的留学生,或在海外从事相关工作,或对自己外语水平有信心的朋友欢迎加入翻译小组。

你能得到:定期的翻译培训提高志愿者的翻译水平,提高对于数据科学前沿的认知,海外的朋友可以和国内技术应用发展保持联系,THU数据派产学研的背景为志愿者带来好的发展机遇。

其他福利:来自于名企的数据科学工作者,北大清华以及海外等名校学生他们都将成为你在翻译小组的伙伴。

点击文末“阅读原文”加入数据派团队~

转载须知

如需转载,请在开篇显著位置注明作者和出处(转自:数据派ID:DatapiTHU),并在文章结尾放置数据派醒目二维码。有原创标识文章,请发送【文章名称-待授权公众号名称及ID】至联系邮箱,申请白名单授权并按要求编辑。

发布后请将链接反馈至联系邮箱(见下方)。未经许可的转载以及改编者,我们将依法追究其法律责任。

点击“阅读原文”拥抱组织

独家|OpenCV1.10 使用OpenCV实现摄像头标定相关推荐

  1. opencv 双目摄像头标定

    我用的是opencv官方的例程,花了一天把代码大致注释了下,但是双目感觉好难,很多地方都不懂,都是在大佬们的博客找的资料 下面是对例程使用的说明 http://blog.csdn.net/t24755 ...

  2. Python+OpenCV相机摄像头标定,矫正畸变,实时输出正常视频流

    搞了个摄像头,拍摄有畸变,拍摄出的直线是弧线形状,类似于鱼眼相机,需要正常输出,遂使用OpenCV进行相机标定 1.畸变参数的提取 大哥用MATLAB提取的畸变内参和畸变系数,用来矫正,我不会,此博客 ...

  3. opencv生成摄像头标定的黑白方格

    注:笔者的开发环境为VS2013+opencv2.4.10 #include"stdafx.h"#include<opencv2/opencv.hpp>//行数#def ...

  4. 独家|OpenCV1.11 使用OpenCV制作一个低成本立体摄像机

    作者:Kaustubh Sadekar 翻译:顾伟嵩 校对:张玲本文约3000字,建议阅读6分钟 本文我们将学习如何创建一个定制的低成本立体摄像机. 标签:3D计算机视觉,摄像机标定,经典计算机视觉, ...

  5. 独家 | OpenCV1.12 对极几何和立体视觉简介(附链接)

    作者:Kaustubh Sadekar 翻译:黄瑞迪 校对:张玲本文约6500字,建议阅读15分钟本文将使用OpenCV和立体视觉来赋予计算机这种深度知觉能力. 你是否曾经好奇过,为什么你带上特制的3 ...

  6. python opencv 摄像头标定_(五)单目摄像头标定与畸变矫正(C++,opencv)

    本文将梳理一种单目摄像头标定和矫正的方法,在梳理的过程中,首先使用网上离线的图片数据跑通流程,然后接入自己的camera,手动采集标定图像,实时矫正相机的畸变,然后输出矫正后的图像.全文基于Openc ...

  7. 用OpenCV进行摄像机标定

    用OpenCV进行摄像机标定 照相机已经存在很长时间了.然而,随着廉价针孔相机在20世纪末的引入,日常生活中变得司空见惯.不幸的是,这种廉价伴随着它的代价:显著的扭曲.幸运的是,这些常数,通过校准和一 ...

  8. 使用OpenCV进行相机标定

    1. 使用OpenCV进行标定 相机已经有很长一段历史了.但是,伴随着20世纪后期的廉价针孔照相机的问世,它们已经变成我们日常生活的一种常见的存在.不幸的是,这种廉价是由代价的:显著的变形.幸运的是, ...

  9. OPENCV3.0 单目摄像头标定(使用官方自带的标定图片)

    OPENCV3.0 单目摄像头标定(使用官方自带的标定图片) 转载于:https://blog.csdn.net/zc850463390zc/article/details/48946855 // o ...

最新文章

  1. 详解H3C交换机“端口安全”功能
  2. List<Object> 转List<String>
  3. vnc远程登录linux黑屏,linux VNC安装好后登录黑屏 鼠标显示黑色大叉的解决方法
  4. linux svn同步到本地目录,LINUX中SVN服务的搭建与实现SVN 自动同步到web目录,SVN自动启动...
  5. python最短路径例子_Python实现的多叉树寻找最短路径算法示例
  6. nosql简答什么是最终一致性_可靠消息最终一致性方案中预发送作用是什么
  7. 【Arthas】Arthas Command处理流程
  8. 【华为】对标谷歌Dropout专利,华为开源自研算法Disout,多项任务表现更佳
  9. 《软件工程》 课后思考题
  10. Stata 15.1下载
  11. a59s刷机包卡刷 oppo_OPPO A59s 5.1 ROM刷机包 ColorOS 精简卡刷包 ROOT权限
  12. web前端腾讯外包面试记录
  13. 操作系统实验 连续内存分配 首次适应(FF)算法
  14. 《一舞醉红尘,一笑歌岁月》
  15. 小米商城项目实战(一)
  16. sucess - money - freedom
  17. PS|渐变及海报制作
  18. 获取行政边界经纬度数据
  19. 单例模式——国庆收心
  20. 设计必备,5个免费图标资源网站

热门文章

  1. 7-4 BCD解密(C语言)
  2. 【c语言】蓝桥杯算法训练 连接字符串
  3. P2801 教主的魔法(分块入门)
  4. GMQ稳定币可降低交易成本,构建智能化支付生态体系
  5. Vmo前端数据模型设计
  6. vim插件的安装方式 -- vim注释插件和doxygen函数注释生成插件-ctrlp插件-tabular等号对齐 插件...
  7. hadoop 第一课 启动dfs 文件系统
  8. 验证码识别,发票编号识别(转)
  9. 发测试邮件或垃圾邮件node脚本
  10. groupadd - 建 立 新 群 组