棋盘格角点检测-libcbdetect

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.xdnf.cn/news/1537259.html

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

相关文章

使用HTML和CSS制作网页的全面指南

目录 引言 一、理解HTML 1. 什么是HTML? 2. HTML文档的基本结构 3. 常用的HTML标签 4. 示例:创建一个简单的HTML页面 二、理解CSS 1. 什么是CSS? 2. CSS的使用方式 3. CSS选择器和属性 4. 常用的CSS属性 三、创建网页的步骤 1. 规…

【Java数据结构】二叉树

目录 树树的特征树的概念 二叉树两种特殊的二叉树二叉树的性质二叉树的基本操作4 种遍历二叉树的方式判断一棵树是不是完全二叉树获取二叉树总共的节点个数获取叶子节点的个数获取第 k 层的节点个数获取二叉树的高度检测值为 value 的元素是否存在 二叉树基本操作完整代码 树 …

VS code 安装使用配置 Continue

Continue 插件介绍 Continue 是一款高效的 VS Code 插件,提供类似 GitHub Copilot 的功能,旨在提升开发者的编程效率。其配置简单,使用体验流畅,深受开发者喜爱。 主要功能特点 智能代码补全 Continue 能够基于当前代码上下文生…

年化60.7%,最大回撤-16.5%,RSRS标准分择时效果差不多

原创内容第653篇,专注量化投资、个人成长与财富自由。 中秋节,祝大家中秋快乐! 人有悲欢离合,月有阴晴圆缺,此事古难全。但愿人长久,千里共婵娟。 今天引入RSRS来择时,看下策略效果。 年化60.7…

Python编码系列—Python代理模式:为对象赋予超能力的魔法

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中…

C++掉血迷宫

目录 开头程序程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 #include <iostream> #include <string> #include <cstring> using namespace std; enum RBYG {R 1,B 2,Y 4,G 7, }; struct heal {int ix…

【例题】lanqiao549 扫雷

输入 3 4 0 1 0 0 1 0 1 0 0 0 1 0输出 2 9 2 1 9 4 9 2 1 3 9 2解题思路 分类讨论&#xff1a; 如果原来的方格整数为1&#xff0c;输出9如果原来的方格整数为0&#xff0c;输出周围8个&#xff08;最多八个&#xff09;的地雷数量和 代码 如何遍历一个方格mp[i][j]周围…

c++中引用是通过指针的方式实现

其实在汇编层面上&#xff0c;引用的代码和指针的代码是一致的。 先看指针情况下的代码分析&#xff0c;如下所示&#xff1a; #include <iostream>using namespace std;void fuzhi(int *x)//引用传参 {*x 10; }int main(int argc, char** argv) {int a 0;int b;a …

架构设计——概念和基础

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

Python编码系列—Python外观模式:简化复杂系统的快捷方式

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

QT安装时出现错误(镜像)

QT下载网站 下载网址 QT安装时出现错误 解决方法 按“win+R”键弹出“运行”窗口,输入"cmd",点击确定; 打开如下图运行框,将Qt文件拖到窗口里->空一格输入“–mirror https://mirrors.aliyun.com/qt”->按enter键进入,即可成功安装 正式安

gazebo遇到的阶段性问题汇总

目录 1 gazebo中碰撞模型崩坏或者飞的问题2 编译报错解决方法 3 控制器无法正常启动解决方法 4 xacro:macro 定义函数5 xacro:property 定义变量的值报错截图解决方法 6 gazebo 模型视觉穿模&#xff08;已设置碰撞体积&#xff09;解决方法穿模截图 1 gazebo中碰撞模型崩坏或者…

王道408考研数据结构-绪论

1.1 数据结构的基本概念 数据结构 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。在任何问题中&#xff0c;数据元素 都不是孤立存在的&#xff0c;它们之间存在某种关系&#xff0c;这种数据元素相互之间的关系称为结构(Structure)。 数据结构包括三方面的内…

中秋的“超级月亮”在哪?来竹海幻境寻找心中的白月光

夜幕低垂&#xff0c;一场视觉盛宴悄然拉开序幕——《桃花江竹海幻境》&#xff08;下文简称《竹海幻境》&#xff09;剧场中。一轮轮明月仿佛穿越时空的使者&#xff0c;与葱郁的竹林交相辉映&#xff0c;与天际那轮皎洁的明月共同编织出一幅“超级月亮”的绝美画卷&#xff0…

sizeof与strlen()函数的对比总结

目录 1.sizeof操作符1.1sizeof操作符特点 2.strlen( )函数2.1 函数简介2.2 创建字符串 3.sizeof 和 strlen的对比 1.sizeof操作符 在学习操作符的时候&#xff0c;我们学习了 sizeof &#xff0c; sizeof 计算变量所占内存内存空间⼤⼩的&#xff0c;单位是字节&#xff0c;如…

C++的类与对象下

目录 1.初始化列表 2.隐式类型转换 1.单参数 2.多参数&#xff08;C11提供的新功能&#xff09; 3.static成员 4.友元 5.内部类 6.匿名对象 1.初始化列表 C祖师爷规定初始化列表是成员变量定义与初始化的地方。 class Time { public:Time(int hour):_hour(hour){cout &…

从虚拟机安装CentOS到自定义Dockerfile构建tomcat镜像

写在开头 整个过程中涉及的三方软件均来源于三方的官网&#xff0c;因此需要有一个稳定良好的访问公网网络的环境&#xff0c;可能需要科学上网 下载并安装 VMware Workstation Player 下载 需要先注册登录&#xff1a;https://login.broadcom.com/signin 下载页面&#xff1a…

7-23 还原二叉树

代码&#xff1a; #include<iostream> using namespace std; int n; char a[55],b[55]; int dfs(int l,int r,int x,int y){ // printf("**l%d,r%d,x%d,y%d\n",l,r,x,y);if(l>r) return 0; // if(lr) return 1;int i;for(ix;i<y;i){if(a[l]b[i]) break;…

信息安全工程师(6)网络信息安全现状与问题

一、网络信息安全现状 威胁日益多样化&#xff1a;网络攻击手段不断翻新&#xff0c;从传统的病毒、木马、蠕虫等恶意软件&#xff0c;到勒索软件、钓鱼攻击、DDoS攻击、供应链攻击等&#xff0c;威胁形式多种多样。这些攻击不仅针对个人用户&#xff0c;还广泛影响企业、政府等…

【OJ刷题】双指针问题5

这里是阿川的博客&#xff0c;祝您变得更强 ✨ 个人主页&#xff1a;在线OJ的阿川 &#x1f496;文章专栏&#xff1a;OJ刷题入门到进阶 &#x1f30f;代码仓库&#xff1a; 写在开头 现在您看到的是我的结论或想法&#xff0c;但在这背后凝结了大量的思考、经验和讨论 目录 1…