首页> 中国专利> 一种直接提取的k个最近邻点搜索方法

一种直接提取的k个最近邻点搜索方法

摘要

本发明涉及逆向工程点云数据最近邻点搜索领域,尤其是一种直接提取的个最近邻点搜索方法。本发明针对现有技术存在的问题,以逆向工程的点云模型为研究对象,提出一种直接提取的个最近邻点搜索方法。利用空间上位置相邻点的k最近邻点集合存在交集的几何特性,通过减少目标搜索点的数量来提升搜索性能。具体做法是:为查询点qhead搜索k个最近邻点,从qhead的反最近邻点的k个最近邻点集合中提取了k1个最近邻点,再通过KNN算法或者其它快速算法为qhead搜索余下的(k-k1)个最近邻点,本算法极大提高了搜索速度。本发明应用于点云数据最近邻点搜索领域。

著录项

  • 公开/公告号CN103744886A

    专利类型发明专利

  • 公开/公告日2014-04-23

    原文格式PDF

  • 申请/专利权人 西南科技大学;

    申请/专利号CN201310717019.3

  • 发明设计人 肖晓萍;李自胜;

    申请日2013-12-23

  • 分类号G06F17/30(20060101);

  • 代理机构51214 成都九鼎天元知识产权代理有限公司;

  • 代理人卿诚;吴彦峰

  • 地址 621010 四川省绵阳市涪城区青龙大道中段59号

  • 入库时间 2024-02-19 23:19:30

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-02-09

    未缴年费专利权终止 IPC(主分类):G06F17/30 授权公告日:20150318 终止日期:20161223 申请日:20131223

    专利权的终止

  • 2015-03-18

    授权

    授权

  • 2014-05-21

    实质审查的生效 IPC(主分类):G06F17/30 申请日:20131223

    实质审查的生效

  • 2014-04-23

    公开

    公开

说明书

技术领域

本发明涉及逆向工程点云数最近邻点据搜索领域,尤其是一种直接提取的 k个最近邻点搜索方法。

背景技术

在数据挖掘及分类、数据库检索和逆向工程点云建模中,由于存在大量无 拓扑关系的离散数据点,为了进行数据分类、相似性比较及法线的估算,需要 查询离任一给定点q距离最近的k个数据点,对q点的特性研究,将在其k最 近邻点的集合中进行。k最近邻搜索方法(k Nearest Neighbors Searching  Algorithm,KNN)由此成为海量数据处理一个必备方法。

在逆向工程中,物体或零件三维经激光扫描仪扫描或坐标测量机测量后得 到大量离散坐标点,原物体的连续表面扫描后得到采样的点云,为了高精度还 原原物体,通常会采用高精度扫描仪,导致点云数据量很大,几十万个点、几 百万个点乃至上千万个点都是正常的。

逆向工程的目的是要对原物体进行反求设计,也就是要得到与原物体尺寸 一样的数字模型,然后对数字模型进行加工生产,得到与原物体一样的物体或 零件。在得到点云数据后,在建立表面建模之前一般都要经过除噪、光顺、拟 合等过程,然而这些过程中,需要用到模型的法线和曲率等几何属性。曲率可 由法线计算而来,因此点的法线计算是反求建模的根本和基础工作。然而,点 云是离散的,点与点之间没有任何关联,即没有拓扑结构,一个独立点的法线 可以指定任何方向,这样就与原物体的表面对应点的法线有很大差异,导致后 续处理过程完全可能失真或走样。因此需要一种科学的方法进行法线估算,使 其尽量与原物体表面上对应点的法线方向保持一致。为了达到这一目的,往往 需要在当前查询点的附近区域寻找一些点,通过这些点来构造当前点的切平 面,称为微切平面,通过微切平面来估算当前点的法线方向。如何在当前查询 点的附近寻找点来构造微切平面,一种科学的方法就是KNN方法。

传统的KNN方法,事先对已知样本点进行剪辑,实现去除分类作用不大的 样本。适用于样本容量比较大的类域的自动分类。具体就是计算当前查询点q 到每一个点的距离并安升序排序,取前k个距离值最小的点。而且数据集中的 每个点都要查询其k个最近邻点,由于点云数据量大,由此看出k最近邻查找 是一个耗时的过程,传统方法也称为暴力搜索方法。于是产生了查询KNN的快 速搜索方法,现有k近邻点快速搜索方法主要有两类:

一类是空间分割法,把点云的包围盒分割成若干个小子空间,查询过程中 首先计算查询点q与所在的子空间内的点的距离并按升序排序,如果最大距离 值大于q与所在子空间壁的距离或子空间内数据点数小于k,则扩展子空间, 并在新子空间内继续搜索;

另一类是数据重组方法,通过构造树形结构,利用相应规则把数据点分别 归属到不同的树节点中,搜索过程中,通过剔除节点以达到缩小搜索范围,提 高搜索速度的目的。

无论是空间分割还是数据重组方法,都使用了点的邻近特性,即:q的k 个最近邻点q的邻近区域。实际上,空间位置上相邻的点,其k个最近邻点构 成的集合必定存在交集,k越大,交集成员的数量也越大,因此可以从空间位 置相邻点的k最近邻点集合中直接提取部分或全部最近邻点,然而,两类快速 算法以及其它算法都没有提及该思想,更没有有效的解决直接提取最近邻点的 方法。

发明内容

本发明所要解决的技术问题是:针对现有技术存在的问题,本发明以逆向 工程的点云模型为研究对象,提出一种直接提取的k个最近邻点搜索方法。利 用空间上位置相邻点的k最近邻点集合存在交集的特点,通过减少目标搜索点 的数量来提升搜索性能。具体做法是:为查询点qhead搜索k个最近邻点,可 以从qhead的反最近邻点(如果qhead点是p点的一个最近邻点,那么p点就 是qhead点的一个反最近邻点)的k个最近邻点集合中提取了k1个最近邻点, 再通过KNN算法或者其他快速算法为qhead搜索余下的(k-k1)个最近邻点, 本算法极大提高了搜索速度。进一步的,在提取最邻近点的过程中,为了节省 存储空间,查询点与最邻近点之间的距离没有再保存,为了避免重复进行距离 计算和提高速度,进一步的,本发明提出采用相关点的向量内积代替距离计算, 进行距离比较。

本发明采用的技术方案如下:

一种直接提取的k个最近邻点搜索方法包括:载入模型的点云数据,针对 点云数据中任意一点,从其反最近邻点的最近邻点中提取k1个最近邻点,然后 通过KNN算法搜索的最近邻点中k-k1个最近邻点,所述最近邻点有k个最近邻 点,其中k是正整数,k1≤k。

进一步的,所述从qhead的最近邻点中提取k1个最近邻点,然后通过KNN算 法搜索qhead的最近邻点中k-k1个最近邻点具体步骤包括:

步骤1:根据模型的点云数据,建立点云数据链表PCDPointLink,qhead是点云 数据中任意一点,pcdPoint是PCDPointLink中的一个节点,链表中的第一个 节点指针为head,令链表遍历变量qhead=PCDPointLink→head,即用变量指针qhead指 向链表的第一个节点,qhead的最近邻点集合kNN(qhead)、qhead的反最近邻点集合 rkNN(qhead)、指向下一个节点的指针Next,qhead与最近邻点的最大距离dmax

步骤2:判断qhead的k个最近邻点集合kNN(qhead)是否为空,若kNN(qhead)为空,则执 行步骤3;否则,执行步骤7;

步骤3:判断rkNN(qhead)是否为空,若rkNN(qhead)为空,则采用KNN算法进行搜索; 否则,令遍历变量qdata=rkNN(qhead)→head(令指针变量qdata指向rkNN(qhead)链表的第 一个节点),计数变量k1=0,执行步骤4;

步骤4:判断kNN(qdata)是否为空,若kNN(qdata)为空,则从qhead的反最近邻点集合的 下一个点去提取,因此qdata=qdata→Next(让指针变量qdata指向rkNN(qhead)当前节点的 后一个节点),重复步骤4;若kNN(qdata)不为空,令遍历变量pdata=kNN(qdata)→head(让 指针变量pdata指向kNN(qdata)的第一个节点),执行步骤5;

步骤5:判断qhead的最近邻点是否为pdata,若pdata是qhead的最近邻点,则将pdata加入 到qhead的最近邻点集合中,将qhead加入到pdata的k个反最近邻点集合,同时 k1=k1+1;否则,pdata不是qhead的最近邻点,则需要判断qdata的最近邻点集合中的 下一个点,因此pdata=pdata→Next(让指针变量pdata指向kNN(qdata)当前节点的后一个 节点),并重复步骤5;

步骤6:当步骤5中,qhead的所有反近邻点的遍历完了后,比较k1与k的关系, 如果k1<k,则qhead提取的最近邻点个数不足k个,通过KNN算法为qhead点搜索k-k1个最近邻点,将qhead的k1个最近邻点加入到集合kNN(qhead)中,将qhead加入到剩余 的k-k1个最近邻点的反最近邻点集合rkNN(pi)中,其中pi表示通过KNN算法搜索 得到的k-k1个最近邻点;如果k1=k,说明算法为qhead直接提取到了k个最近邻点, 执行步骤7;

步骤7:qhead=qhead→Next(让qhead指向链表PCDPointLink下一个节点),重复步骤 2到步骤6,得到qhead的k个最近邻点kNN(qhead)。

进一步的,所述步骤5判断qhead的最近邻点是否为pdata为:距离比较算法和 向量内积比较算法。

进一步的,所述步骤3中向量内积计算法判断依据是:如果qhead∈kNN(qdata), 任意点Pdata∈kNN(qdata),如果a×βT>0,则有Pdata∈kNN(qhead),a和β是向量,a×βT>0 等价于qheadpdata的距离小于qheadpi的距离,因此pdata是qhead最近邻点。

进一步的,所述步骤5判断qhead的最近邻点是否为pdata具体步骤: 步骤51:由于点云数据的每一个点qhead都要查找其k个最近邻点,由于qhead是整 个方法开始的第一个点,其通过KNN算法找到qhead的k个最近邻点,并构成集合 kNN(qhead),将要为下一个点qhead查找k个最近邻点。选择qhead点作为下一个点来进 行搜索,我们从qhead的最近邻点集合kNN(qhead)中选择qhead

步骤52:根据判定条件,qhead∈kNN(qdata),qdata的最近邻点集合kNN(qdata)内任一点pdata, 我们先判断pdata是不是qhead的一个最近邻点,如果是,则把pdata放入qhead的k个最 近邻点集合kNN(qhead)中去;

步骤53:由于kNN(qdata)已知,qdata的k个最近邻点中,离qdata距离最大点的距离值dmax已知,以qdata为球心,以dmax为半径构造一个球S,则qdata的k个最近邻点全部位 于球S内,离qdata距离最大的点在球面上,以qdata为射线的起点画射线,该射线 经过qhead,与球面S相较于Pi,点pdata和点Pi的中点为Pm,则可以构造出与上述判 定条件一致的和如果a×βT>0,则说明|qheadPdata|<|qheadPi|,因此 pdata是qhead最近邻点,把pdata放入qhead的k最近邻点集合kNN(qhead)中;

步骤54:pdata判断之后,继续判断kNN(qdata)中的其余k-2个点,因qhead是qdata的 最近邻点;

步骤55:qdata只是qhead的一个反最近邻点,因此还需要对qhead的其它反最近邻 点Pi进行提取,从Pi的最近邻点集合kNN(Pi)中搜索,提取方法如上述步骤52、步 骤53、步骤54;

步骤56:反最近邻点都搜索完毕后,统计为qhead提取的最近邻点个数k1, 如果k1≥k的话就结束qhead最近邻点搜索过程,说明qhead的k个最近邻点已经全部 通过直接提取找到;如果k1<k的话,说明只为qhead点提取到了k1个最近邻点,通 过KNN算法为qhead点搜索k-k1个最近邻点。

综上所述,由于采用了上述技术方案,本发明的有益效果是:

1)为点云数据中任意一点qhead搜索k个最近邻点,具体做法是从qhead的反 最近邻点(如果qhead点是p点的一个k最近邻点,那么p点就是qhead点的一个反 最近邻点)的k个最近邻点集合中提取了k1个最近邻点,同时结合其它快速 算法(例如快速算法--空间分割法的KNN算法)为qhead搜索余下的(k-k1)个最近邻 点,因此算法极大提高了搜索速度。

2)在提取最邻近点的过程中,为了节省存储空间,查询点与最邻近点之 间的距离没有再保存,为了避免重复进行距离计算和提高速度,本发明提出采 用相关点的向量内积进行距离比较。方便计算,大大提高运算速度。

附图说明

本发明将通过例子并参照附图的方式说明,其中:

图1是本发明的流程图。

图2是基于向量内积的距离比较法示意图。

图3是数据点是否是最近邻点的判定准则示意图。

具体实施方式

本说明书中公开的所有特征,或公开的所有方法或过程中的步骤,除了互 相排斥的特征和/或步骤以外,均可以以任何方式组合。

本说明书(包括任何附加权利要求、摘要和附图)中公开的任一特征,除 非特别叙述,均可被其他等效或具有类似目的的替代特征加以替换。即,除非 特别叙述,每个特征只是一系列等效或类似特征中的一个例子而已。

说明书:qhead,qdata和pdata表示指针变量,指向链表的节点,节点中的数据 就是点云的数据点,为了使图和权利书中的符号保持一致,图3中用符号qhead, qdata和pdata表示数据点。

本发明的具体步骤:如图1所示。

步骤1:根据模型的点云数据,建立点云数据链表PCDPointLink,qhead是 点云数据中任意一点,pcdPoint是PCDPointLink中的一个节点,链表中的第 一个节点指针为head,令链表遍历变量qhead=PCDPointLink→head,即用变量指针qhead指向链表的第一个节点,qhead的最近邻点集合kNN(qhead)、qhead的反最近邻点集合 rkNN(qhead)、指向下一个节点的指针Next,qhead与最近邻点的最大距离dmax

步骤2:判断qhead的k个最近邻点集合kNN(qhead)是否为空,若kNN(qhead)为空(说明 还没有对qhead搜索最近邻点),则执行步骤3;否则,执行步骤7;

步骤3:判断rkNN(qhead)是否为空,若rkNN(qhead)为空(说明qhead也不是其它点的k 个最近邻点之一),则采用KNN算法进行搜索(注:链表第一个节点都要采用 其它算法来搜索);否则,令遍历变量qdata=rkNN(qhead)→head(说明qhead已经是其它 点的k个最近邻点之一),计数变量k1=0,执行步骤4;

步骤4:判断kNN(qdata)是否为空,若kNN(qdata)为空,则从qhead的反最近邻点集合的 下一个点去提取,因此qdata=qdata→Next,重复步骤4;若kNN(qdata)不为空,令遍历 变量pdata=kNN(qdata)→head,执行步骤5;

步骤5:判断qhead的最近邻点是否为pdata,若pdata是qhead的最近邻点,则将pdata加入 到qhead的最近邻点集合中,将qhead加入到pdata的k个反最近邻点集合,同时k1=k1+1 (这一步说明为qhead提取到了一个最近邻点pdata,将pdata保存到qhead的最近邻点集 合中,同时将qhead保存到pdata的反最近邻点集合中去,qhead的最近邻点提取计数 变量k1加1);否则,pdata不是qhead的最近邻点,则需要判断qdata的最近邻点集合 中的下一个点,因此pdata=pdata→Next,并重复步骤5;

步骤6:步骤5中qhead的所有反近邻点的遍历完了后,比较k1与k的关系,如果 k1<k,则qhead提取的最近邻点个数不足k个,通过KNN算法为qhead点搜索k-k1个最 近邻点,将qhead的k1个最近邻点加入到集合kNN(qhead)中,将qhead加入到剩余的k-k1个 最近邻点的反最近邻点集合rkNN(pi)中,其中pi表示通过KNN算法搜索得到的k-k1个最近邻点;如果k1=k,说明算法为qhead直接提取到了k个最近邻点,执行步骤7; 步骤7:qhead=qhead→Next,让qhead指向链表PCDPointLink下一个节点,重复步骤 2到步骤6,得到qhead的k个最近邻点kNN(qhead)。

其中步骤5中判断qhead的最近邻点是否为pdata采用距离比较算法和向量内积 比较算法。具体原理为:

1、距离比较算法原理:如图2所示,将要进行距离比较,作为某点是否是 最近邻点的判断准则。在三维空间中(点的坐标用x,y,z进行表示),有三个 点p0(x0,y0,z0),p1(x1,y1,z1)和p2(x2,y2,z2),dist(p1,p0)表示p1和p0之间的距离,dist(p2,p0) 表示p2和p0之间的距离,则dist(p1,p0)=(x1-x0)2+(y1-y0)2+(z1-z0)2,dist(p2,p0)=(x2-x0)2+(y2-y0)2+(z2-z0)2.计算出dist(p1,p0)和dist(p2,p0)之后,就可以比 较|p0 p1|和|p0 p2|。如果dist(p1,p0)>dist(p2,p0),则说明|p0 p1|>|p0 p2|,反之 亦然。

2、采用向量内积比较算法来达到进行距离比较,原理是:为点p1和点p2的之间的中点,向量a=p1-p2,向量β=p12-p0,如果a×βT>0则 有dist(p1,p0)>dist(p2,p0),也即是:a×βT>0等价于|p0 p1|>|p0 p2|。

3、数据点是否是最近邻点判定准则应用于本发明中具体做法是:如图3所 示。

令kNN(qdata)为qdata的k个最近邻点构成的集合,kNN(qhead)为qhead的k个最近邻点 构成的集合。判定条件:如果qhead∈kNN(qdata),任意点Pdata∈kNN(qdata),如果 a×βT>0,则有Pdata∈kNN(qhead),a和β是向量,a×βT>0等价于qheadpdata的距离小 于qheadpi的距离,因此pdata是qhead最近邻点。具体做法是:

步骤51:由于点云数据的每一个点qhead都要查找其k个最近邻点,由于qhead是整 个方法开始的第一个点,其通过KNN算法找到qhead的k个最近邻点(KNN快速算 法比如:空间分割方法或者数组重组方法进行搜索),并构成集合kNN(qhead),将 要为下一个点qhead查找k个最近邻点。选择qhead点作为下一个点来进行搜索,我 们从qhead的最近邻点集合kNN(qhead)中选择qhead

步骤52:根据判定条件,qhead∈kNN(qdata)(即:qdata是qhead的一个最近邻点,那么qhead是qdata的一个反最近邻点),qdata的最近邻点集合kNN(qdata)内任一点pdata,我们先判 断pdata是不是qhead的一个最近邻点,如果是,则把pdata放入qhead的k个最近邻点集 合kNN(qhead)中去;

步骤53:由于kNN(qdata)已知,qdata的k个最近邻点中,离qdata距离最大点的距离值dmax已知,以qdata为球心,以dmax为半径构造一个球S,则qdata的k个最近邻点全部位 于球S内,离qdata距离最大的点在球面上,以qdata为射线的起点画射线,该射线 经过qhead,与球面S相较于Pi,点pdata和点Pi的中点为Pm,则可以构造出与上述判 定条件一致的和如果a×βT>0,则说明|qheadPdata|<|qheadPi|,因此 pdata是qhead最近邻点,把pdata放入qhead的k最近邻点集合kNN(qhead)中;

步骤54:pdata判断之后,继续判断kNN(qdata)中的其余k-2个点,因qhead是qdata的 最近邻点;

步骤55:qdata只是qhead的一个反最近邻点,因此还需要对qhead的其它反最近邻 点Pi进行提取,从Pi的最近邻点集合kNN(Pi)中搜索,提取方法如上述步骤52、步 骤53、步骤54;

步骤56:反最近邻点都搜索完毕后,统计为qhead提取的最近邻点个数k1,如 果k1≥k的话就结束qhead最近邻点搜索过程,说明qhead的k个最近邻点已经全部通 过直接提取找到;如果k1<k的话,说明只为qhead点提取到了k1个最近邻点,通过 KNN算法为qhead点搜索k-k1个最近邻点。

本发明并不局限于前述的具体实施方式。本发明扩展到任何在本说明书中 披露的新特征或任何新的组合,以及披露的任一新的方法或过程的步骤或任何 新的组合。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号