点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

相机和距离传感器的标定是机器人和计算机视觉领域中非常重要的基础问题之一。虽然MATLAB和OpenCV里都有对应的工具箱或者库函数,可以直接用来做相机标定,但如果需要同时标定多个相机(比如多目机器人、阵列相机),那这些传统的标定法将消耗掉研究者和开发者的大量时间和精力。

有没有一种省心的、全自动化的标定方法呢?

这里介绍一种可以实现全自动化对相机-相机、相机-距离传感器之间进行标定的方法,并且有论文和源码哦(见文末)!例如,该算法可以实现同时对三目相机 + 激光扫描仪(下图左)、双目相机 + Kinect (下图右)的标定。是不是觉得很赞!

角点检测方法对比

这种全自动化标定方法比较复杂,本文重点介绍一下该方法在棋盘格角点检测方面的原理。

我们知道棋盘格中角点检测方法是相机标定中重要的步骤之一。比如Opencv中的函数findChessboardCorners 就可以轻松实现棋盘格角点检测结果。如下图所示:

那为什么这里还要研究棋盘格角点检测呢?直接调函数不就OK了吗?

这是因为OpenCV函数虽然简单易用,但是在实际使用中,存在不少问题,这里列举几个:

  • 需要提前指定棋盘格的行数列数作为输入。

  • 需要多次拍摄获得多张不同方向角度的棋盘格图片进行标定。

  • 鲁棒性差。棋盘格不能有干扰,否则就会使得角点检测失败,而且棋盘倾斜角度较大也会检测失败。

  • 无法同时进行多个相机的标定。

本文的角点检测方法可以解决上述问题,主要体现在:

  • 不需要提前指定棋盘格行数列数。

  • 标定过程只需要拍摄一张包含多个棋盘的图片。

  • 鲁棒性好。因为是基于生长的算法,所以如果出现干扰,就会绕过干扰,生长出最大的棋盘。

  • 标定精度很高。

  • 适用范围广。包括针孔相机、鱼眼相机、全景相机等。

基于生长的棋盘格角点检测原理

本文棋盘格角点检测算法主要分三个步骤:定位棋盘格角点位置;亚像素级角点和方向的精细化;优化能量函数、生长棋盘格。下面分别详细介绍。

1

定位棋盘格角点位置

要处理的图片中一般会包含很多非棋盘的自然或人工背景,所以第一步就是定位角点的位置。下图是角点检测原理示例。

首先定义两种不同的角点原型。一种用于和坐标轴平行的角点(上图a),另一种用于旋转45°的角点(上图b)。根据实践经验可以发现,这两种简单的原型对于由透视变换引起的较大范围的变形的角点检测来说,已经足够。每个原型由4个滤波核{A,B,C,D}组成,用于后面和图像进行卷积操作。然后利用这两个角点原型来计算每个像素点与角点的相似程度(Corner likelihood),这里称之为角点概率。

我们得到的角点概率图虽然能够给出大致的角点范围,但是如何进一步得到角点精确的位置呢?下一步就是在角点概率图上利用非极大值抑制(non-maxima-suppression,NMS)来获得候选点。

那么何为非极大值抑制呢?

非极大值抑制顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里我们用NMS来选取那些邻域里分数最高的极大值像素点,同时抑制那些分数低的像素点。

然后用梯度统计的方法在一个局域的n x n邻域内验证这些候选点(上图e)。先对局域灰度图进行sobel滤波,然后计算加权方向直方图(32bins),用mean shift算法找到其中的两个主要的模态α1,α2,。根据边缘的方向,对于期望的梯度强度:

构造一个模板T:

(*表示互相关操作符)和角点概率图的乘积作为角点得分(Corner score),然后用阈值进行判断就得到了角点(上图f)。

2

亚像素级角点和方向的精细化

但是上面得到的角点一般不是很精确,需要进一步对角点的位置以及边缘方向进行亚像素级精细化处理。

假设c是理想的角点位置,p是c的局部邻域的一个像素点,gp是p点的图像梯度向量,那么就有:

简单解释一下上式。原因如下图:中心绿色的点表示理想角点c,假如像素点p不在边界上,如下图标号为1的位置,平坦区域梯度gp为零向量,所以上式成立;假如像素点p在边界上,如下图标号为2的位置,梯度gp向量方向垂直向下,(p-c)方向水平向左,两向量方向互相垂直,所以上式仍成立。

上图是理想情况下棋盘格,但是实际上边缘不可能这样锐利(只有一个像素大小),梯度方向也没有这么理想,最理想的角点c的位置就是我们在角点候选点c’的邻域Ni(c’)内找到满足以下式子的c’:

邻域的像素通过梯度幅值自动加权,上述式子右侧对c’求导并令其等于0,可以得到解析解:

下一步就是refine边缘方向矢量e1,e2,可以通过最小化normals的偏差和对应的梯度实现:

3

优化能量函数生长棋盘格

定义棋盘格的能量函数如下:

其中第一项E_corners是当前棋盘中角点总数的负值。第二项E_structure描述了用两个相邻角点来预测第3个角点的匹配程度,分别对棋盘的每行和每列相邻的3个角点(triples)计算其结构能量,取其中的最大值作为该棋盘的结构能量。

值得注意的是,由于结构能量约束中使用的是局域的线性约束,上述棋盘格生长方法可以扩展到鱼眼镜头拍摄的高畸变图像。

不难发现,计算量和棋盘大小呈现指数关系,当棋盘尺寸较大时,计算量会非常惊人。所以在求解时不能使用穷举法搜索,在此使用的是一种离散优化策略,在实践中证明比较有效。具体过程见上图(a)。

解释一下:

给定一个种子角点,我们沿着其边缘方向搜索产生一个初始化的种子棋盘格。该棋盘格有3x3个角点,有2x2个棋盘(见上图(a)中最左侧)。然后以此种子棋盘格为基础,分别从最外沿的4个边缘去生长棋盘格,生成4个新的棋盘格proposals。如果其中能量最小的那个棋盘格的能量值比棋盘格扩展前的能量更减少了,就说明生长成功,用这个新的棋盘格代替原来棋盘格。继续生长,直到4个 方向新棋盘格能量不再减少为止。上图(c)是最终的检测结果。

另外,为了在单张图片中生长出多个棋盘格,我们把每个角点都尝试作为种子点用上述方法去生长,这样会产生多个重叠的棋盘格。我们只保留能量函数最小的那个作为最终的结果,其他的重叠部分去掉即可。

关于优化部分不再 介绍,这部分可以参考文末的论文。

先来欣赏一下该方法的结果吧,棋盘格生长结果如下图所示。

结构恢复和棋盘匹配结果如下图所示。最上面的一行是单目广角和鱼眼相机标定图像;中间一行是双目相机和Kinect相机标定图;最下面一行是三目相机和Velodyne HDL 64线激光扫描仪标定图。

总结讨论

本文介绍的全自动化标定方法的优势:

1、可以同时计算多相机的内参、外参,以及相机-距离传感器之间的变换矩阵,时间在一分钟内

2、算法在不同的光照条件下仍然鲁棒

3、标定过程完全不需要人工干预,真正全自动化

本文算法有什么缺点吗?

该算法受限于棋盘格的约束,所以当棋盘被部分遮挡时,检测结果就不尽如人意。如下图,算法找到的棋盘格是在其约束条件下最好的结果。但是左下方的棋盘因为是次优的所以被忽略掉。这在鱼眼相机标定中非常不利。因为鱼眼镜头越靠近边缘畸变越大,越难以被检测到,但是却对计算标定参数越重要。下一篇我再介绍其他的棋盘格角点检测方法,可以解决这个问题。

论文及源码

本文算法对应的参考论文:

Geiger A, Moosmann F, Car Ö, et al. Automatic camera and range sensor calibration using a single shot[C]//Robotics and Automation (ICRA), 2012 IEEE International Conference on. IEEE, 2012: 3936-3943.

本文算法工程及源码:

http://www.cvlibs.net/software/libcbdetect/

本文算法在线标定toolbox:

http://www.cvlibs.net/software/calibration/

好消息!

小白学视觉知识星球

开始面向外开放啦

一次拍摄搞定多相机自动化标定相关推荐

  1. 爆火AIGC产品卷翻海外营销:AI一键搞定美工和拍摄,抠图PS设计样样精通,月活迅速破百万...

    允中 发自 凹非寺 量子位 | 公众号 QbitAI 第一批被AI抢饭碗的设计师已经出现了. 随着各个互联网大厂纷纷发布如何将AI工具融入日常工作流中,美工.设计.原画等众多岗位纷纷出现了裁员爆料,毫 ...

  2. 再见 Jenkins!几行脚本搞定自动化部署,这款神器有点厉害

    title: 再见 Jenkins!几行脚本搞定自动化部署,这款神器有点厉害 date: 2021-04-30 20:42:32 tags: CICD Jenkins 在开发或生产环境中,我们经常会搞 ...

  3. Python自动化(十二):一分钟搞定几百个Excel中查找的数据

    一.需求说明 首先我们来看下今天的需求,有一份档案记录总表的Excel工作簿, 每天会根据当天日期建立新表,每天的表格内包含所有档案信息,同时也有可能会添加新的档案名.同个年度的总表在年末可能会有两. ...

  4. android+延迟拍摄,延时摄影很难吗? iphone拍+后期全搞定

    手机也能拍出大片,还是目前高端大气的延时摄影,这听起来有点儿不可思议!但如果你的智能手机支持延时摄影拍摄,你还真可以用手机拍大片,甚至说后期都全靠手机来制作.不信你且看我娓娓道来. 在生物演变.天体运 ...

  5. 好用到爆的Python自动化办公教程pdf,Python × Excel × Word × PPT 一次搞定

    在这个自动化时代,我们有很多重复无聊的工作要做.想想这些你不再需要一次又一次地做的无聊的事情,让它自动化,让你的生活更轻松.那么在本文中,我将向您介绍一个好用到爆的Python自动化办公教程pdf,P ...

  6. 【可乐荐书】Python自动化办公应用大全(ChatGPT版):从零开始教编程小白一键搞定烦琐工作

    本栏目将推荐一些经典的.有趣的.有启发性的书籍,这些书籍涵盖了各个领域,包括文学.历史.哲学.科学.技术等等.相信这些书籍不仅可以让你获得知识,还可以让你感受到阅读的乐趣和魅力. 今天给大家推荐的书籍 ...

  7. android 图片墙拼贴,三步搞定 用APP打造图片文字拼贴效果

    相信大家一定见过一种文字拼贴效果的图片,许多大小不一.字体不同.颜色各异的文字拼合出一幅完整的画面.如果你曾经也想自己制作这么一张高端大气上档次的独特图片,却苦于自己的PS水平不到家,那么一定不要错过 ...

  8. Google Pixel 2拍照黑科技:单摄搞定背景虚化+内部潜伏神秘芯片

    安妮 夏乙 发自 凹非寺 量子位 出品 | 公众号 QbitAI Google最新亲儿子Google Pixel 2系列一发布,拍照效果的好评就已铺天盖地. 凭借着几乎毫无亮点的单摄像头,这款手机在D ...

  9. 搞定这8个实战项目,秒杀80%人工智能工程师面试者

    微信公众号 关键字全网搜索最新排名 [机器学习算法]:排名第一 [机器学习]:排名第一 [Python]:排名第三 [算法]:排名第四 在互联网行业流传着这样一句话:"得人工智能者得天下.& ...

最新文章

  1. 找不到包含 OwinStartupAttribute 的程序集
  2. uml识别事件表格_LOPA分析:使能条件和修正因子在场景识别方法中的应用
  3. 微信小程序横向图片左右滑动
  4. android requestparams传入对象,Android xutils3上传文件使用示例
  5. iOS 深入解析之NSArray
  6. 2017-10-06-构建之法:现代软件工程-阅读笔记
  7. c语言中vector函数大全,vector :: empty()函数,以及C ++ STL中的示例
  8. LeetCode 543. 二叉树的直径(DFS)
  9. SQL Server数据库-限制返回行数
  10. mysql安装./depcomp_编译安装mysql及问题汇总
  11. visual studio code安装_Deepin系统中如何安装Visual Studio Code
  12. 中移4G模块-ML302-OpenCpu开发-2-MQTT连接阿里云
  13. 富士康立讯精密可能仍在苹果汽车代工商候选名单中
  14. poj 1734 Sightseeing trip(floyd 拓展 求最小环)
  15. 第一章 安装和使用SQL Server 2008 R2
  16. svn server 搭建
  17. 站在知乎肩上-做更强的自己(2)
  18. js调用数科阅读器_js调用后台,后台调用前台等方法总结
  19. 《华为基本法》-笔记
  20. 拼接字符串Joiner的用法

热门文章

  1. 李一男:别了港湾 被逼上绝路的对手
  2. 如何换算天干地支和现在的纪年,计月,计日,计时
  3. CMMI评估EPG问答
  4. 恋爱指南----《强迫的爱》
  5. 四川中医药高等专科学校计算机,四川中医药高等专科学校2020年招生录取分数线...
  6. linux下intel安装教程,在 Ubuntu 15.10 上安装 Intel Graphics 安装器
  7. 欧姆龙温控器参数笔记(五)(高级功能设定菜单)
  8. 如何修改聚合后的数据的index
  9. temporal简介
  10. 关于4294967295这个数字