棋盘格角点检测-libcbdetect

news2024/9/20 17:56:41

libcbdetect

libcbdetect 是一个用于自动子像素级别的棋盘格(checkerboard)、棋盘(chessboard)以及 Deltille 图案检测的库。它主要由 C++ 编写,旨在提供高精度、高鲁棒性的角点检测和图案组合功能,是一种基于生长的棋盘格角点检测方法。

基于生长的棋盘格焦点检测方法具有以下特性:

解决的问题:

  • 需要提前指定棋盘格尺寸。这在很多自动化应用中是很难做到的。
  • 鲁棒性差。棋盘格如果有干扰(比如轻微的遮挡)就会使得检测失败,而且棋盘倾斜角度较大也会检测失败。具体测试见上述链接。
  • 无法处理一张图片包含多张棋盘的情况。

优点:

  • 不需要提前指定棋盘格数目。
  • 鲁棒性好。因为是基于生长的算法,所以如果出现干扰,就会绕过干扰,生长出最大的棋盘。
  • 可以检测一个图片里包含多张棋盘的情况。

缺点:

  • 受棋盘的矩形形状约束,只能生长出矩形的棋盘。严格的说也不能算缺点,因为本身棋盘就是矩形的,真的长出三头六臂还能叫棋盘吗。
  • 计算量较大。主要集中在棋盘生长部分。
    在这里插入图片描述在这里插入图片描述

image.png

算法原理介绍

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

定位棋盘格角点位置

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

image.png

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

下面我们利用这两个角点原型来计算每个像素点与角点的相似程度(Corner likelihood),来看下面的定义:

c = m a x ( s 1 1 , s 2 1 , s 1 2 , s 2 2 ) s 1 i = m i n ( m i n ( f A i , f B i ) − μ , μ − m i n ( f C i , f D i ) ) s 2 i = m i n ( μ − m i n ( f A i , f B i ) , m i n ( f C i , f D i ) − μ ) μ = 0.25 ( f A i + f B i + f C i + f D i ) c = max(s_1^1, s_2^1, s_1^2, s_2^2) \\ s_1^i = min(min(f_A^i,f_B^i)-\mu, \mu -min(f_C^i,f_D^i)) \\ s_2^i = min(\mu - min(f_A^i,f_B^i), min(f_C^i,f_D^i) - \mu) \\ \mu = 0.25(f_A^i + f_B^i + f_C^i + f_D^i) c=max(s11,s21,s12,s22)s1i=min(min(fAi,fBi)μ,μmin(fCi,fDi))s2i=min(μmin(fAi,fBi),min(fCi,fDi)μ)μ=0.25(fAi+fBi+fCi+fDi)
其中:

  • f A i f_A^i fAi表示卷积核和原型i(i=1,2)在某个像素点的卷积结果。
  • s 1 i s_1^i s1i s 2 i s_2^i s2i表示原型i的两种可能的flippings,考虑棋盘格角点出向左对角线为黑,右对角线为白;或相反

在这里插入图片描述
若4个核中任何一个结果比较小,则Corner linkelihood的值c很小,对于过滤大量的非棋盘格式的角点,然后通过NMS算法获取角点精确的位置。

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

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

假设c是理想的角点,p是c的局部领域的一个像素点, g P g_P gP是p点在图像梯度的向量,那么
g p T ( p − c ) = 0 g_p^T (p-c) = 0 gpT(pc)=0
在这里插入图片描述

如图所示,中心点绿色表示理想点c,假如图像点p不再边界上,标号1的位置平坦区域梯度 g p g_p gp为零向量,所以:
g p T ( p − c ) = 0 g_p^T(p-c)=0 gpT(pc)=0

假如像素点p在边界上,标号2的位置,梯度 g P g_P gP向量方向垂直向下, ( p − c ) (p-c) (pc)方向水平向左,两向量方向互相垂直,所以:
g p T ( p − c ) = 0 g_p^T(p-c)=0 gpT(pc)=0

这是一种在理想情况下的棋盘格,但实际上边缘不可能这样锐利(只有一个像素大小),梯度方向也没有这么理想,最理想的角点c的位置就是我们在角点候选点 c ′ c' c的领域 N I ( c ′ ) N_I(c') NI(c)内找到满足以下的式子c’:
在这里插入图片描述邻域的像素通过梯度幅值自动加权,上述式子右侧对c’求导并令其等于0,可以得到解析解:
在这里插入图片描述下一步就是refine边缘方向矢量e1,e2,可以通过最小化normals的偏差和对应的梯度实现:
在这里插入图片描述

优化能量函数生长棋盘格

定义棋盘格的能量函数如下:
在这里插入图片描述

在这里插入图片描述在这里插入图片描述其中第一项E_corners是当前棋盘中角点总数的负值。 第二项E_structure描述了用两个相邻角点来预测第3个角点的匹配程度,分别对棋盘的每行和每列相邻的3个角点(triples)计算其结构能量,取其中的最大值作为该棋盘的结构能量。
值得注意的是,由于结构能量约束中使用的是局域的线性约束,上述棋盘格生长方法可以扩展到鱼眼镜头拍摄的高畸变图像。
在这里插入图片描述计算量和棋盘大小呈现指数关系,当棋盘尺寸较大时,计算量会非常惊人。所以在求解时不能使用穷举法搜索,在此使用的是一种离散优化策略,在实践中证明比较有效。

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

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

应用场景

  1. 相机标定 :libcbdetect 是相机标定过程中常用的工具之一。通过检测图像中的棋盘格图案,可以准确地计算出相机的内参和外参,从而实现对相机的精确标定。这对于机器视觉、摄影测量等领域具有重要意义。
  2. 视觉测量与定位 :除了相机标定外,libcbdetect 还可以用于视觉测量与定位等领域。通过对图像中的特征点进行精确提取和匹配,可以实现高精度的测量和定位功能。这对于工业自动化、机器人导航等领域具有潜在的应用价值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2142057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据中心可视化管理平台:提升运维效率

通过图扑可视化平台实时监控设备状态、能耗和网络流量,帮助运维团队快速识别和处理异常,提高运营效率,确保系统稳定与可靠性。

在 Dify 中高效利用 SiliconCloud API

引言 SiliconCloud 以其丰富的模型库和卓越的处理速度,在 Dify 平台上实现高效工作流和智能代理变得轻而易举。本文将指导您如何在 Dify 中集成 SiliconCloud 的强大功能。 集成 SiliconCloud 模型 步骤一:设置 SiliconCloud 账户 首先,您…

SHT30温湿度传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理 三、程序设计 main.c文件 sht30.h文件 sht30.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 SHT30是一种常见的温湿度传感器,是一款完全校准的线性化的温湿度数字传感器&#xff0…

8.1 溪降技术:横渡绳

目录 8.1 横渡绳将其置于上下文中:观看视频课程电子书:横渡绳一级横渡绳:识别使用横渡绳固定到横渡绳V7提示:保持张力中间点通过横渡绳上的中间点固定到锚点总结 8.1 横渡绳 绳上移动 横渡绳是一条水平安全绳,探险者可…

vue3 自定义el-tree树形结构样式

这里样式设置主要用到了 windcss 实现效果 模拟数据 这里也可以用模拟的数据,下面用的是后端请求的真实数据 [{"id": 5,"rule_id": 0,"status": 1,"create_time": "2019-08-11 13:36:09","update_time": "…

集团门户网站设计与实现

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装集团门户网站软件来发挥其高效地信息处理的作用&#xff0c…

深度学习之线性代数预备知识点

概念定义公式/案例标量(Scalar)一个单独的数值,表示单一的量。例如:5, 3.14, -2向量 (Vector)一维数组,表示具有方向和大小的量。 ,表示三维空间中的向量 模(Magnitude)向量的长度,也称为范数(通常为L2范数…

【论文阅读】BC-Z: Zero-Shot Task Generalization with Robotic Imitation Learning

Abstract 在这篇论文中,我们研究了使基于视觉的机器人操纵系统能够泛化到新任务的问题,这是机器人学习中的一个长期挑战。我们从模仿学习的角度来应对这一挑战,旨在研究如何扩展和扩大收集的数据来促进这种泛化。为此,我们开发了…

掌握回流与重绘面试回答:优化网页加载与响应速度

认识回流reflow和重绘repaint 理解回流reflow:(也可以称之为重排) 第一次确定节点的大小和位置,称之为布局(layout)。 之后对节点的大小、位置修改重新计算称之为回流 什么情况下引起回流呢? 比如DOM结构发生改变(添加新的节点或者移除节…

Cortex-A7的GIC(通用中断控制器):边沿触发和电平触发中断的区别

0 资料 ARM Generic Interrupt Controller Architecture version 2.0 Architecture Specification1 边沿触发和电平触发中断的区别 1.1 边沿触发和电平触发中断官方解释 边沿触发(Edge-triggered) This is an interrupt that is asserted on detectio…

架构设计——概念和基础

🏠1 架构基础 想要搞清楚架构到底指什么,架构与框架的区别,就需要了解梳理系统、子系统、模块、组件、框架和架构 1.1系统与子系统 1.1.1系统 wiki:系统泛指由一群有关联的个体组成,根据某种规则运作,能完成个别元…

无限制使用OpenAI最新o1-mini、o1-preview模型:经济高效的AI推理模型

OpenAI 最新推出的 o1 模型是该公司推理模型家族的首位成员,它通过创新的“思维链”训练模式,显著提升了逻辑推理和问题解决的能力。o1 模型在编程竞赛问题、数学奥林匹克资格赛以及物理、生物和化学问题的基准测试中表现出色,甚至在某些领域…

数据爬虫中遇到验证码的解决方法

在数据爬虫中遇到验证码是一个常见且复杂的问题,验证码的存在主要是为了阻止自动化工具(如爬虫)对网站进行过度访问或数据抓取,以保护网站的安全性和数据的准确性。 一、验证码的基本概念与类型 验证码(CAPTCHA&…

PointNet++改进策略 :模块改进 | LFA | RandLA-Net,通过随机采样与局部特征聚合提升大规模3D点云处理效率

论文题目:RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds发布期刊:CVPR作者地址:1牛津大学、2中山大学、3国防科学技术大学代码地址:https://github.com/QingyongHu/RandLA-Net介绍 这篇论文题为《RandLA-Net: Efficient Semantic Segmentatio…

我又做了一个国标GB28181设备模拟器的Windows版本,让国标28181开发更简单,不用再费劲弄个摄像机来调试国标GB28181开发了

之前我搞过一个《EasyGBD国标GB28181设备端模拟器帮助测试国标GB28181平台(EasyGBD->EasyGBS)》,当时,主要是在安卓手机上,用摄像机的本地摄像头来做为视频源、用摄像机的麦克风做为音频源,对外…

基于windows的mysql5.7安装配置教程

目录 0.写在前面的话 1.下载安装包 2.进行目录选择和解压操作 3.配置环境变量 4.创建my.ini文件 5.管理员运行终端 6.安装mysqld 7.初始化数据库 8.启动mysql服务 9.进入mysql管理终端 10.修改root密码 11.刷新权限 12.注销内容 13.重启mysql 14.输入密码测试 1…

Node.js 安装及项目实践

node.js安装 node安装,选择版本 一直next,或者自己修改路径,添加两个包 选择自己的安装的node的路径,cmd或者winr cmd 显示node与npm的版本号 node -vnpm -v可以跟着这个博客将node安装 2024最新版Node.js下载安装及环境配…

云原生信息安全:筑牢数字化时代的安全防线

云原生信息安全:筑牢数字化时代的安全防线 一、云原生信息安全概述 云原生安全包含两层重要含义。一方面,面向云原生环境的安全,目标是防护云原生环境中的基础设施、编排系统和微服务等系统的安全。在云原生内部,安全机制多以云原…

Java--String类(StringBuilder与StringBuffer)

String类的特征: String类的特点: 1. String 类在设计时就是不可改变的, String 类实现描述中已经说明了 String部分源码如下: 2. 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象 例如…

string的模拟实现and友元

一、引言 “知所从来,方知其往。”只有了解一个物体的构造才能更好的使用它。正所谓“不入虎穴,焉得虎子。”那我们学会使用一个类了,可不可以建造一个简易的类和对象出来呢?答案显而易见。因为这是C的内容,所以我们用…