3D Matching:实现halcon中的find_surface_model

news/2024/5/1 14:04:41

        halcon中的三维匹配大致分为两类,一类是基于形状的(Shape-Based),一类是基于表面的(Surface-Based)。基于形状的匹配可用于单个2D图像中定位复杂的3D物体,3D物体模型必须是CAD模型,且几何边缘清晰可见,使用的相机也要预先进行校准。基于表面的匹配可用于3D场景中快速定位复杂的3D物体,比如在点云中寻找物体,模型可以从CAD或3D传感器中获得,可以包含光滑的表面,基于表面的匹配也称为“体积匹配”。

halcon中的surface matching

        halcon中surface matching参考文献为:Model Globally, Match Locally: Efficient and Robust 3D Object Recognition,该方法已申请专利。通常我们只要知道模型中的三个点,以及其在场景中对应的三个点就可以确定位姿,如果每个点都有一个方向,那么只需要一组对应点和转动角度就能确定位姿。文献中定义了PPF(point pair feature)这样的特征矢量,在创建模板时计算每个特征点与其他特征点的PPF,构建哈希表,将具有相同 feature 的 point pair 放在一起,在匹配时从场景中选取一部分关键点,将每个关键点与其他场景点计算PPF,根据存储好的哈希表对模型点和转动角度进行反向投票,超过设定分数就认为找到了模型的point pair,根据模型点和转动角度算出变换矩阵得到初始位姿,再用ICP求精。

        基于PPF的surface matching网上有很多文章,GitHub上有很多开源实现,opencv中也实现了该算法,对于算法的原理我不再详细展开,感兴趣的可以自己查找相关资料。这里只谈一下我的实现过程及所遇到的问题。

模型点云

        首先是模型训练,最主要的问题是点云降采样,降采样可以加速计算,并且避免一些很接近的点,在点云匹配过程也需要对场景进行降采样,点云的降采样有两种办法,一种是使用kdtree,一种是使用octree,目前两种方法我还在对比中,降采样之后的PPF计算,需要限制两个点的距离和法向量夹角,夹角超过30度都会保留,计算好后保存至本地。

模型点云(降采样后)

        第二步是模型匹配,先对场景点降采样,之后选取一定比例的场景点作为关键点,然后计算每个关键点与其他场景点的PPF,根据模型训练时保存的哈希表对模型点和转动角度进行投票,如果票数高于设定值,保存关键点、模型点与转动角度,并计算变换矩阵,该矩阵即为模型点对应关键点的位姿。值得注意的是计算PPF时要以关键点为圆心,选取指定半径范围内的场景点,因为距离太远的两个点不可能处在同一物体上,在Going Further with Point Pair Features这篇文章就指出使用一大一小两个voting ball做两轮投票,大小半径由bounding box确定。

        第三步是位姿聚类,上一步中得到了很多位姿,这里我们要进行两次聚类,第一次是针对一个参考点对应多个位姿,第二次是针对一个位姿对应多个参考点,两种情况下都需要合并,第一次聚类将位姿转换为axis-angle+translate的形式,通过旋转角度和平移量判断是否为同类,第二次聚类将位姿转换为rotation+translate的形式,直接对模型的box center进行旋转+平移,如果变换后的点非常接近,直接合并。

        第四步是点云配准,即ICP pose refinement,以第三步得到的位姿作为初始值,在场景点中寻找模型点的最近点,根据距离和方向确定对应关系,由新的点对计算新的位姿,再以新的位姿进行下一次计算,迭代至收敛或发散。对于收敛的结果重新进行评分,落在模型上的点越多,分数越高。在配准过程中找到正确的对应点以及使用稳健的icp非常关键,对应点的查找我们借助kdtree或者octree,icp使用robust symmetric icp。

        目前的速度和精度还可以,可视化是在cloudcompare中完成,后续我会发布测试demo,对于位姿筛选、ICP算法、投票过程,我会继续深入研究,也欢迎大家与我讨论。

匹配结果1

匹配结果2


http://www.mrgr.cn/p/00448168

相关文章

ABC211 复盘

ABC211 复盘 [ABC211C] chokudai 思路解析 题目说的很明白,看到匹配子序列可以轻易想到是简单 dp,直接做即可。 时间复杂度:两个字符串两层循环,\(O(8 \times N)\)。 code #include<bits/stdc++.h> using namespace std; const int N = 1e5 + 10; const long long mo…

说说你对树的理解?相关的操作有哪些?

一、是什么 在计算机领域,树形数据结构是一类重要的非线性数据结构,可以表示数据之间一对多的关系。以树与二叉树最为常用,直观看来,树是以分支关系定义的层次结构 二叉树满足以下两个条件:本身是有序树 树中包含的各个结点的不能超过 2,即只能是 0、1 或者 2如下图,左侧…

解决加载GPT2(Tensorflow预训练模型)的Linear权重到PyTorch的Linear权重 形状不匹配(互为转置)问题

解决报错内容: RuntimeError: Error(s) in loading state_dict for PyTorchBasedGPT2:size mismatch for transformer.h.0.attn.c_attn.weight: copying a param with shape torch.Size([768, 2304]) from checkpoint, the shape in current model is torch.Size([2304, 768])…

掌握网络抓取技术:利用RobotRules库的Perl下载器一览小红书的世界

引言 在信息时代的浪潮下&#xff0c;人们对于获取和分析海量网络数据的需求与日俱增。网络抓取技术作为满足这一需求的关键工具&#xff0c;正在成为越来越多开发者的首选。而Perl语言&#xff0c;以其卓越的文本处理能力和灵活的特性&#xff0c;脱颖而出&#xff0c;成为了…

golang+kafka

目录1. 安装JDK、Zookeeper、Scala、kafka2. 启动kafka3. 创建topics4. 查看topics5. 打开一个producer6. 打开一个consumer7. 测试发送和接收消息Windows下安装Kafka 1. 安装JDK、Zookeeper、Scala、kafka 安装Kafka之前,需要安装JDK、Zookeeper、Scala。Kafka依赖Zookeeper,…

golang kafka

目录1. 安装JDK、Zookeeper、Scala、kafka2. 启动kafka3. 创建topics4. 查看topics5. 打开一个producer6. 打开一个consumer7. 测试发送和接收消息Windows下安装Kafka 1. 安装JDK、Zookeeper、Scala、kafka 安装Kafka之前,需要安装JDK、Zookeeper、Scala。Kafka依赖Zookeeper,…

快速测试连接SQLServer数据库的方法

微软的SQL Server数据库应该是中小企业中使用最多的数据库,一般个人测试环境也都是用的它。 下面介绍一种快速测试SQL Server数据库连接性的方法: 1.新建一下记事本,将后缀名修改为udl;2.选中当前文件,右键打开文件属性,点选“提供程序”,选中 Microsoft OLE DB Provide…

JS代码混淆器:iPaGuard — 让你的代码看起来令人头大

在当今互联网时代,JavaScript 作为一种广泛应用的编程语言,扮演着至关重要的角色。然而,随着网络技术的不断发展,JavaScript 代码也面临着日益增加的安全威胁。为了保护 JavaScript 代码免受未经授权的复制、修改和逆向工程,开发者需要借助专业的工具和技术。其中,iPaGua…

Kano的编程之旅

瓦力觉启 |主程序原理---避障| 目录一.雷达避障(1)(2)二.深度避障1.原理2.控制3.主要函数(1).雷达避障主函数(2).相关参数三.超声波避障今日份美图 一.雷达避障 (1)(2)二.深度避障 1.原理 (1)摄像头的中心与摄像头坐标系统的中心可能存在偏差 (2)摄像头的坐标系和小车的坐标系统…

编译器优化等级提高导致的死机问题

如下图代码 理论上执行完UART4_IROHandler_num = 0才对,-O1的时候的确如此,但是开启-O3后已进入这个中断就会HardFault。 好在停止仿真后能看出来死在了哪里 然后就进来UART4_IRQHandler单步仿真看是哪句话导致的,定位到最后一句的赋值操作,应该赋值0的,但是每次都是个无序…

常见的垃圾回收器(下)

文章目录 G1ShenandoahZGC 常见垃圾回收期&#xff08;上&#xff09; G1 参数1&#xff1a; -XX:UseG1GC 打开G1的开关&#xff0c;JDK9之后默认不需要打开 参数2&#xff1a;-XX:MaxGCPauseMillis毫秒值 最大暂停的时间 回收年代和算法 ● 年轻代老年代 ● 复制算法 优点…

机器学习和深度学习--李宏毅(笔记与个人理解)Day9

Day9 Logistic Regression&#xff08;内涵&#xff0c;熵和交叉熵的详解&#xff09; 中间打了一天的gta5&#xff0c;图书馆闭馆正好npy 不舒服那天天气不好&#xff0c;哈哈哈哈哈总之各种理由吧&#xff0c;导致昨天没弄起来&#xff0c;今天补更&#xff01; 这里重点注意…

如何使用KPI评估研发项目

在本文中,我们将讨论一些关键绩效指标(KPI),这些指标可以帮助您评估您的研发项目的价值和进展。研发项目对于创新至关重要,但同时也面临不确定性、风险和复杂性。那么该如何衡量和评估它们的表现和影响呢? 在本文中,我们将讨论一些关键绩效指标(KPI),这些指标可以帮助…

SAP ERP出海解决方案提供商【工博科技】,为中国企业“出海”护航

当今高质量发展成为主题,中国企业正积极将创新成果、产品、服务“走出去”。然而出海企业面临着充满不确定性的国际环境带来的风险管控挑战和全球化经营带来的竞争挑战,必须要不断提升风险管控能力和综合竞争实力。其中,成熟的数字化能力可以在保护企业数字安全的同时提供发…

创建一个javascript公共方法的npm包,js-tool-big-box,发布到npm上,一劳永逸

前端javascript的公共方法太多了&#xff0c;时间日期的&#xff0c;数值的&#xff0c;字符串的&#xff0c;搞复制的&#xff0c;搞网络请求的&#xff0c;搞数据转换的&#xff0c;几乎就是每个新项目&#xff0c;有的拷一拷&#xff0c;没有的继续写&#xff0c;放个utils目…

java多渠道消息推送-(微信公众号、钉钉、邮箱、系统内部、短信等)

1. 消息对象定义 1.1 通用消息对象定义package com.yj.notice.message; import com.yj.commons.tools.utils.DateUtils; import com.yj.commons.tools.utils.StringUtil; import com.yj.notice.costant.NoticeMethodEnum; import lombok.AllArgsConstructor; import lombok.Bu…

【2024蓝桥B组】 R格式

R格式 题目 题目分析 1.看似是x*2n,实际上可以看为x对自身的累加,例如: x*21=x*2=2x x*22=(x+x)+(x+x)=4x x*23=((x+x)+(x+x))+((x+x)+(x+x))=8x ... 所以,我们可以自己调用一个函数:在该函数实现对s自身的累加,由于我们需要进行多次对自身的累加,所以我们采用指针void …

从 0 搭建公司Jenkins服务 Centos7

从 0 搭建公司Jenkins服务 Centos7 安装 (运维人员) 安装环境 配置DNS安装JDK17安装Jenkins安装Docker安装GIT安装Ansible启动Jenkins安装插件配置凭据配置共享库配置 (开发经理)使用 (开发、测试人员) 安装 (运维人员) 安装环境 配置DNS 新安装系统的服务器无法解析域名&a…

shell脚本中的运算符和条件判断

shell脚本中的运算符和条件判断: 一、算术运算符 在Shell脚本中,你可以使用各种运算符来执行数学运算、比较和逻辑操作。 计算方式:$[ ] $(( ))例: a=$[(9+5)90] 打印输出结果 ==> echo $a 二、条件判断 判断方式:test $a = 90 [ $a = 90 ]注意事项: 判断处理中间空格…

研究表明,全球互联网流量竟有一半来自机器人

据Cyber News消息&#xff0c;Thales Imperva Bad Bot近期做了一份报告&#xff0c;显示在2023年有49.6%的互联网流量竟来自机器人&#xff0c;比上一年增长 2%&#xff0c;达到自2013年以来观察到的最高水平。 报告称&#xff0c;这一趋势正对企业组织产生负面影响&#xff0c…