基于生长的棋盘格角点检测方法--(1)原理介绍

2023-05-16

前言

棋盘格中角点检测方法是相机标定中必不可少的步骤之一。Opencv中的函数

bool findChessboardCorners(InputArray image, Size patternSize, OutputArray corners, int flags=CALIB_CB_ADAPTIVE_THRESH+CALIB_CB_NORMALIZE_IMAGE )

就可以轻松实现棋盘格角点检测结果。如下图所示
这里写图片描述
具体使用方法参考如下链接
http://blog.csdn.net/u011651743/article/details/51099543
但是,这种方法虽然简单,但是在实际使用中有如下问题:
1、 需要提前指定棋盘格尺寸。这在很多自动化应用中是很难做到的。
2、 鲁棒性差。棋盘格如果有干扰(比如轻微的遮挡)就会使得检测失败,而且棋盘倾斜角度较大也会检测失败。具体测试见上述链接。
3、 无法处理一张图片包含多张棋盘的情况。

基于此,今天介绍的是一种新的检测方法。主要参考论文《Automatic Camera and Range Sensor Calibration using a single Shot》。可以针对性地解决上述问题。
优点:
1、 不需要提前指定棋盘格数目。
2、 鲁棒性好。因为是基于生长的算法,所以如果出现干扰,就会绕过干扰,生长出最大的棋盘。
3、 可以检测一个图片里包含多张棋盘的情况。
缺点:
1、受棋盘的矩形形状约束,只能生长出矩形的棋盘。严格的说也不能算缺点,因为本身棋盘就是矩形的,真的长出三头六臂还能叫棋盘吗。不过以后我会介绍一种不依赖棋盘约束的方法。
2、计算量较大。主要集中在棋盘生长部分。

先来欣赏一下该方法的结果吧
这里写图片描述

算法原理介绍

算法主要分三个步骤:1、 定位棋盘格角点位置,2、亚像素级角点和方向的精细化,3、优化能量函数、生长棋盘格。下面具体来说明

1、 定位棋盘格角点位置

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

首先定义两种不同的角点原型。一种用于和坐标轴平行的角点(上图a),另一种用于旋转45°的角点(上图b)。根据实践经验可以发现,这两种简单的原型对于由透视变换引起的较大范围的变形的角点检测来说,已经足够。每个原型由4个滤波核{A,B,C,D}组成,用于后面和图像进行卷积操作。
下面我们利用这两个角点原型来计算每个像素点与角点的相似程度(Corner likelihood),来看下面的定义:
这里写图片描述
其中这里写图片描述 表示卷积核A和原型i(i=1,2)在某个像素点的卷积响应。
这里写图片描述表示原型i的两种可能的flippings,也就是照顾到棋盘格角点可能会出现左对角线为黑,右对角线为白;或者左对角线为白,右对角线为黑的情况,如下图
这里写图片描述 这里写图片描述
不难发现如果四个核中有任何一个的响应值比较小的话,Corner likelihood的值c就会很小。这种特点对于去掉大量的非棋盘格式的角点很重要。
对每个像素点都进行上述计算后,得到了一个Corner likelihood图(如上图d)。

我们得到的Corner likelihood图虽然能够给出大致的角点范围,但是如何进一步得到角点精确的位置呢?下一步就是在Corner likelihood图上利用非极大值抑制(non-maxima-suppression,NMS)来获得候选点。
那么何为非极大值抑制呢?
非极大值抑制顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一个邻域,邻域有两个参数可变,一是邻域的维数,二是邻域的大小。这里我们用NMS来选取那些邻域里分数最高的极大值像素点,同时抑制那些分数低的像素点。非极大值抑制算法的详细原理参考:
http://www.cnblogs.com/liekkas0626/p/5219244.html

然后用梯度统计的方法在一个局域的n x n邻域内验证这些候选点(上图e)。先对局域灰度图进行sobel滤波,然后计算加权方向直方图(32bins),用mean shift算法找到其中的两个主要的模态 这里写图片描述 。根据边缘的方向,对于期望的梯度强度 这里写图片描述构造一个模板T。这里写图片描述 (*表示互相关操作符)和Corner likelihood的乘积作为角点得分(Corner score),然后用阈值进行判断就得到了角点(上图f)。

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

但是上面得到的角点一般不是很精确,需要进一步对角点的位置以及边缘方向进行亚像素级精细化处理。
假设c是理想的角点位置,p是c的局部邻域的一个像素点,这里写图片描述 是p点的图像梯度向量,那么就有 这里写图片描述
简单解释一下原因如下图:中心绿色的点表示理想角点c,假如像素点p不在边界上,如下图标号为1的位置,平坦区域梯度这里写图片描述 为零向量,所以 这里写图片描述;假如像素点p在边界上,如下图标号为2的位置,梯度这里写图片描述 向量方向垂直向下,(p-c)方向水平向左,两向量方向互相垂直,所以这里写图片描述
这里写图片描述
上图是理想情况下棋盘格,但是实际上边缘不可能这样锐利(只有一个像素大小),梯度方向也没有这么理想,最理想的角点c的位置就是我们在角点候选点c’的邻域 这里写图片描述内找到满足以下式子的c’:
这里写图片描述
邻域的像素通过梯度幅值自动加权,上述式子右侧对c’求导并令其等于0,可以得到解析解:
这里写图片描述
下一步就是refine边缘方向矢量e1,e2,可以通过最小化normals的偏差和对应的梯度实现:
这里写图片描述
这里写图片描述

3、 优化能量函数生长棋盘格

我们定义棋盘格的能量函数如下:
这里写图片描述
这里写图片描述
这里写图片描述
其中第一项E_corners是当前棋盘中角点总数的负值。 第二项E_structure描述了用两个相邻角点来预测第3个角点的匹配程度,分别对棋盘的每行和每列相邻的3个角点(triples)计算其结构能量,取其中的最大值作为该棋盘的结构能量。
值得注意的是,由于结构能量约束中使用的是局域的线性约束,上述棋盘格生长方法可以扩展到鱼眼镜头拍摄的高畸变图像。
这里写图片描述

不难发现,计算量和棋盘大小呈现指数关系,当棋盘尺寸较大时,计算量会非常惊人。所以在求解时不能使用穷举法搜索,在此使用的是一种离散优化策略,在实践中证明比较有效。具体过程(见上图(a))如下:
给定一个种子角点,我们沿着其边缘方向搜索产生一个初始化的种子棋盘格。该棋盘格有3x3个角点,有2x2个棋盘(见上图(a)中最左侧)。然后以此种子棋盘格为基础,分别从最外沿的4个边缘去生长棋盘格,生成4个新的棋盘格proposals。如果其中能量最小的那个棋盘格的能量值比棋盘格扩展前的能量更减少了,就说明生长成功,用这个新的棋盘格代替原来棋盘格。继续生长,直到4个 方向新棋盘格能量不再减少为止。

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

参考资料

1、论文
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.

2、网站
http://www.cvlibs.net/software/libcbdetect/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于生长的棋盘格角点检测方法--(1)原理介绍 的相关文章

  • [综合面试] 牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

    感谢面试群 S 北京 陈磊 的整理分享 基础篇 xff1a 操作系统 计算机网络 设计模式 一 xff1a 操作系统 1 进程的有哪几种状态 xff0c 状态转换图 xff0c 及导致转换的事件 2 进程与线程的区别 3 进程通信的几种方式
  • 利用python语言制作简单的音乐播放器

    from tkinter import from tkinter import filedialog from pygame locals import import time import pygame import sys pygame
  • 小四轴——空心杯电机引起的电源干扰

    问题 用STM32做了一个微型四轴的飞控 xff0c 使用的是空心杯电机 xff0c 使用一个MOS管驱动 xff0c 但是现在电机只要运行起来 xff0c 就会产生非常大的干扰 xff0c 直接导致STM32复位或不运行 经过换电容 xf
  • PX4开发(1):ubuntu下pixhawk开发环境搭建

    1 介绍 之前买了个330的四轴 xff0c 最近想利用起来 xff0c 所以买了个pixhawk来玩 pixhawk是开源的 xff0c 所以想看看能不能在其基础上开发出什么 要做开发首先要配置环境 xff0c 由于官方推荐在linux环
  • μC/OS-II 要点分析 ------ PendSV_Handler

    首先贴出今天要与大家分享的内容源码 xff08 位于内核源码的 os cpu a asm 中 xff09 xff1a PendSV Handler CPSID I MRS R0 PSP CBZ R0 PendSV Handler Nosav
  • PX4开发(2):QGroundControl的使用及电调校准——准备起飞

    1 介绍 上一节把固件烧写好了 xff0c 接下来进行传感器的校准了 xff0c 传感器校准要使用官方的地面站 xff0c 也就是QGC QGroundControl xff0c 官网下载点击这里 安装好QGC后打开 xff0c 然后将pi
  • Linux驱动开发04:块设备驱动和网络设备驱动

    介绍 因为块设备驱动和网络设备驱动实际中用得较少 xff0c 所以只给出驱动模板 xff0c 我也没有具体测试 xff0c 等到实际用到是再研究吧 xff0c 溜了溜了 块设备驱动模板 span class hljs keyword str
  • 支撑程序员的三种精神

    我注意到有三种精神指引着软件开发人员的灵魂 伟大的艺术家精神 xff0c 可信赖的员工精神和自私的实用主义精神 伟大的艺术家精神 如果你听到一种声音说 你不能这样画 xff0c 然后 xff0c 你继续这样画 xff0c 这种反对的声音就会
  • docker数据迁移

    docker数据迁移 前言 开发服务器随着docker运行服务的变多 xff0c docker目录占用磁盘空间也在逐渐变大 xff0c 终于在最近磁盘彻底占满导致容器启动不起来并提示 34 no device space left 34 为
  • 超好看的个人主页官网源码+带动态特效

    正文 这款个人主页源码感觉是我有史以来见过最好看的 xff0c 功能和页面也比较多 xff0c 简约又不失格调 官网带动态特效视频源码 xff0c 修改主页文件即可 程序 wwvwd lanzouw com i6RWe0ag8gde 图片
  • A2W、W2A、A2T、T2A的使用方法

    1 A2W和W2A 在 Window核心编程 xff0c 多字节和宽字节之间转换比较麻烦的 xff0c MultiByteToWideChar函数和WideCharToMultiByte函数有足够多的参数的意义让我们去理解 那么使用ATL的
  • C语言中int到float的强制类型转换

    最近在看一本名为的书 由于我所看过的计算机理论方面的书较少 xff0c 加上自己大学期间一直也不用功 xff0c 所以对于计算机的工作原理以及程序的工作方式我始终只知甚少 xff0c 印象也十分模糊 不过 xff0c 应该说我碰到了一本好书
  • MFC中如何将焦点设置到指定控件上

    MFC中如何将焦点设置到指定控件上 需求 xff1a 窗口打开的时候就将焦点 xff08 光标 xff09 设置到某个指定的控件上去 实现方法 xff1a 设置焦点需要用到setFocus这个方法 xff08 几乎任何编程环境都这样VC x
  • _tcschr、_tcsrchr

    tcschr tcsrchr 好处 xff1a 是可以不管是用unicode 编码还是其他 代码都不用改 C 43 43 标准库函数提供了字符和字符串的操作函数 xff0c 并提供了其UNICODE版本 xff0c 如 xff1a 1 tc
  • vc++ 6.0编译后生成的文件

    vc 43 43 6 0编译后生成的文件 程序在编译后 在目标路径下会生成多个文件 Debug文件夹 exe ilk obj pch pdb idb pdb cpp dsp ncb plg exe 是生成的可执行文件 ilk 当选定渐增型编
  • 除了pid还有什么控制算法,类似pid算法还有哪些

    什么是专家PID xff1f 他和传统的PID有什么区别 xff1f PID是智能控制啊 比如要控制一个水管的水流量 通过流量计 开关阀 让PID来控制开关阀的开关大小使水流量正确 专家PID记得是PID的高级设置 某些个场合一般的PID无
  • c++编译错误:invalid new-expression of abstract class type

    error invalid new expression of abstract class type UserdataActionI 原因 xff1a 出现这个错误原因是new 了一个抽象类出错 xff0c 说明父类 xff08 接口 x
  • Servlet jsp跳转到Servlet 出现404错误的路径设置方法

    jsp跳转到Servlet 出现404错误的路径设置方法 解决一 xff1a 最近又遇到了这种问题 xff0c 百度了好久 xff0c 发现有人说要在action的路径里面写Servlet文件的绝对路径 xff0c 比如说 xff0c 单独
  • 产品经理做APP从头到尾的所有工作流程详解!

    xff08 一 xff09 项目启动前 从事产品的工作一年多 xff0c 但自己一直苦于这样或者那样的困惑 xff0c 很多人想要从事产品 xff0c 或者老板自己创业要亲自承担产品一职 xff0c 但他们对产品这个岗位的认识却不明晰 xf
  • 使用阿里云搭建自己的原型发布站点

    最近在做项目时 xff0c 使用了Axure团队协同工具 AxureShare 时 xff0c 发现了一个问题 xff1a 由于AxureShare服务器在国外 xff0c Axure共享生成的链接访问时非常慢 xff0c 网上找了很多解决

随机推荐