专利名称:一种基于四叉树索引的海量激光扫描点云实时绘制方法
技术领域:
本发明涉及海量激光扫描点云数据绘制技术,尤其是建立高效四叉树索引,并基 于该索引结构的海量激光扫描点云实时绘制方法。
背景技术:
机载激光扫描(Light Detection And Ranging以下简称LiDAR)是集激光测距、 全球定位以及惯性导航技术于一体的新型空间测量技术。该技术能够快速获取探测目标高 精度的三维坐标,具有广泛的应用前景。当前LiDAR扫描频率已普遍达到IOOKHz以上,每 次飞行采集的数据量非常巨大。由于计算机内存大小以及显卡渲染速度的制约,对于海量 点云数据的可视化还是一个非常复杂、有待解决的问题。为了实现海量LiDAR点云的实时 显示和动态漫游,研究LiDAR点云的索引组织方式,以及实时绘制方法具有重要的意义和 价值。目前对于激光点云的绘制,在实际应用中常采用抽稀的方式进行处理。例如 TerraScan和PointVue LE等软件,都需要设定最大绘制点数,以此来对点云进行抽稀,仅 对抽稀后的点进行绘制。这种方法实现简单,不需要对数据进行预处理,但并没有真正解决 海量点云实时绘制的问题。LiDAR点云在数据量增大的同时,也提供了更多的细节信息,采 用抽稀显示的处理方法,为了保证显示的流畅性,必须随着点云数据量的增加提高抽稀比 例,这样必定会造成细节信息的丢失,在进行放大显示时,丢失细节的现象就更为明显。为了实现海量LiDAR点云的高效绘制,需要在绘制时采用可见性剔除和层次细节 (Level Of Detail以下缩写为L0D)技术。LiDAR点云是非结构化的离散点云,分布不均勻, 要实现LiDAR点云的快速可视性剔除和L0D,必须对点云建立索引。支晓栋等在论文《基于 改进四叉树的LiDAR点云数据组织研究》中采用四叉树来建立点云索引,并对索引方法和 索引效率进行了分析,但没有在此基础上进一步解决海量LiDAR点云的绘制问题,黄先锋 等在论文《机载激光雷达点云数据的实时渲染》中提出一种顺序四叉树的索引结构,利用四 叉树的每一层节点来存储点云,并将点云数据顺序组织,以方便的将点云数据整块加载到 图形处理器(Graphic Processing Unit以下缩写为GPU)中进行绘制。但该方法不是将点 云数据全部存储在四叉树的叶子节点上,在进行数据裁剪时,为了保证获得完整的裁剪数 据,必须将落入裁剪框的四叉树节点从根节点开始逐层向下全部裁剪出来,这种方式会造 成大量的数据冗余,当裁剪框减小时,裁剪效率下降得更加明显。Rusinkiewicz等在论文 《QSplat :AMultiresolution Point Rendering System for Large Meshes》中运用点模型 来表达复杂的几何体,并开发出了 QSplat (软件名称)的点绘制技术。但他们所采用的点 模型实际上是小的面片,通过考虑面片的遮挡关系来实现点模型的约简,且其建立的索引 也不适合处理LiDAR点云。
发明内容
本发明的目的在于针对目前LiDAR点云数据量巨大的特点,提出了一种点云四
5叉树索引快速建立方法,并基于该索引结构实现海量点云的实时高质量绘制。本发明所采用的技术方案是一种基于四叉树索引的海量机载激光扫描点云实时 绘制方法,包括以下步骤步骤1,对原始的激光点云数据建立四叉树索引,具体包括以下步骤,步骤1. 1,根据激光点云数据包围盒范围和总点数,计算激光点云数据的平均点密 度;所述激光点云数据包围盒范围采用激光点云数据的包围盒的长度length和宽度width 标记,总点数记为ptNum,激光点云数据的平均点密度density按公式(1)算得; 步骤1. 2,根据激光点云数据包围盒的长度length、宽度width以及步骤1. 1所得 平均点密度density,计算激光点云数据分块的长度1和宽度w,以及四叉树深度cbpth其 中 IXwXdensity ^ max_ptNum(3)即预先设定阈值maX_ptNum,每一个激光点云数据分块中的激光点总点数 IXwXdensity 不能超过阈值 max_ptNum ;步骤1. 3,利用步骤1. 2所得激光点云数据分块的长度1和宽度w对激光点云数据 进行网格分块,得到多个激光点云数据分块;所述网络分块的实现方式为,设激光点云数据中某个激光点的坐标为(x,y,z),整 个激光点云数据的包围盒左下角坐标为(bbmin_x,bbmin_y),则根据公式(4)计算出每个 激光点所属的分块号,其中col_No为分块的列号,row_No为分块的行号,col_No = (x-bbmin_x)/wrow_No = (y-bbmin_y)/1(4)步骤1. 4,首先,根据步骤1. 2所得四叉树深度cbpth建立四叉树索引,将每一个 激光点云数据分块对应四叉树最底层的一个叶节点,叶节点的指针指向对应激光点云数据 分块所含激光点的真实存储位置;每个激光点云数据分块都是一个长度为1、宽度为w的矩 形,计算出矩形的外接圆圆心(cell_x,cell_y)和半径cell_r分别作为对应叶子节点的圆 心和半径,并将激光点云分块中的点数Cell_ptNum记入相应叶子节点中;从最底层的叶子 节点开始逐层向上建立父节点,直到四叉树的根节点时完成四叉树的建立;每个父节点所 对应圆的圆心和半径是其所有子节点的外接圆圆心和半径,所包含的激光点数是其子节点 中的激光点数之和;步骤1. 5,将步骤1. 4中建立的四叉树索引补充为一棵完全的四叉树,将四叉树中 不包含激光点云数据的节点标记为dummy ;步骤2,利用步骤1所得四叉树索引对激光点云数据进行绘制,具体包括以下步 骤,步骤2. 1,利用四叉树索引实现对激光点云数据的快速视场裁剪,实现方式为在进行点云数据绘制时,只对落入显示区域内的激光点云数据进行绘制,即利用显示区域的 包围盒对四叉树索引进行裁剪,裁剪方法是用四叉树中节点的圆心和半径构成的圆与裁剪 框进行相交判断,如果圆在裁剪框内或与裁剪框相交,则表示该节点所包含的激光点数据 全部或部分位于显示区域内;如果圆在裁剪框外,则表示该节点包含的激光点数据在显示 区域外;裁剪时从根节点开始,如果节点标记为dummy或节点在裁剪框外,则直接跳过该节 点;如果节点在裁剪框内,则继续对该节点的子节点进行裁剪直到最底层的叶节点,得到落 入裁剪框的所有节点;步骤2. 2,在绘制细节控制下对步骤2. 1所得剪裁结果进行实时绘制,实现方式如 下,首先,根据叶节点的半径cell_r,按公式(5)计算出叶节点投影到屏幕上的半径Rscreen = eell_r X scale(6)其中,scale为投影转换的尺度参数,由当前裁剪框范围与在屏幕上的显示窗口大 小计算得到;设裁剪框的长度为clipping_len,显示窗口长度为viewportjen,按公式(7) 计算scale,scale = viewport_len/clipping_len(8)然后,根据裁剪得到的叶节点得到对应的激光点云数据分块,采用视觉感知驱动 的最优细节层次自动确定方法,计算出每个点云分块应绘制激光点总数draw_nUm,实现方 法为,设在屏幕上绘制的最小目标半径为miruradius,min_radius根据具体显示分辨率设 置,按公式(9)计算出为达到最优绘制细节层次,每个分块应绘制激光点总数draw_nUm,draw—num = Rscreen/min—radius(10)最后,逐块绘制与裁剪得到的叶节点对应的激光点云数据分块,如果当前绘制的 激光点云数据分块的应绘制激光点数draw_nUm大于激光点云数据分块中的总点数,则绘 制该激光点云数据分块中全部的激光点;如果应绘制激光点总数draw_nUm小于激光点云 数据分块中的总点数,则随机提取该激光点云数据分块中draw_nUm个激光点进行绘制,绘 制方式为遍历提取激光点云数据分块中的点,然后判断该点是否在裁剪框内,如果在就绘 制该点,直到已绘制的点数达到应绘制激光点数draw_nUm或者该激光点云数据分块中的 全部点遍历完。而且,在步骤1.5建立完整的四叉树之后,为四叉树的所有节点编写索引号后进 行序列化,即将步骤1. 5中所得四叉树中的节点按照节点索引号顺序存储到文件中,形成 线性四叉树;在步骤2. 2提取激光点云数据分块中激光点进行绘制时,用索引号计算出相 应叶节点在文件中的位置,从而直接提取激光点云数据分块中激光点。而且,由于四叉树中的每个父节点都具有四个子节点,设四个子节点将父节点所 覆盖的空间划分为四个象限,根据象限实现编写索引号,实现过程如下,设定四叉树中的某个节点的索引号celljdx,其父节点索引号parentjdx,该节 点所在其父节点的象限号quadrant通过比较该节点的圆心位置(cell_x,cell_y)与父节 点的圆心位置(parent),parent_y)来计算,计算方法见(11);该节点的索引号cell_idx 根据父节点索引号parentjdx及所在父节点的象限号quadrant计算得到,计算方法见公 式(12);将四叉树的根节点的编号设为0,自根节点开始,逐层向下计算各个节点的索引
7号; cell_idx = 4 X par ent_i dx+quadrant
(14)。而且,在步骤2中,通过渐进绘制技术和渲染时间控制,实现海量点云数据的实时 交互;所述渐进式绘制技术,是最初绘制点云数据的粗略概况,然后逐渐精化;并利用双 缓冲绘制方法,每次绘制都先绘制到后备缓冲上,然后进行前后缓冲的交换,以避免在绘制 过程中出现抖动现象;所述渲染时间控制,是通过一个监控器来监控当前外部输入事件,当无交互请求 时,则分配一段时间给渲染器进行点云绘制,当收到用户交互请求时,则将渲染器挂起,保 证优先响应用户请求。本发明通过对点云数据建立四叉树索引,可以提高数据查找速度。在此基础上,还 提出对四叉树索引采用线性化存储,能够保证在进行数据查找时按一个方向顺序遍历,避 免了来回查找造成数据交换上的“颠簸”现象;利用视觉感知驱动来自动确定绘制的细节程 度,实现了绘制效果和绘制速度的平衡;利用渲染时间控制和渐进式绘制方法,实现了海量 数据的实时绘制和用户操作的及时响应。
图1为本发明实施例的LiDAR点云数据示意图;图2为本发明实施例的LiDAR点云数据分块示意图;图3为本发明实施例的LiDAR点云分块编号示意图;图4为本发明实施例的点云四叉树索引示意图;图5为本发明实施例的序列化后的线性四叉树示意图;图6为本发明实施例中利用裁剪框对激光点云裁剪的示意图;图7为本发明实施例中四叉树裁剪得到的节点示意图;图8为本发明实施例中基于渲染时间控制的点云绘制流程图。
具体实施例方式下面通过实施例,并结合附图,对本发明的技术方案作进一步具体的说明。实施例所提供的一种基于四叉树索引的海量LiDAR点云实时绘制方法,流程如 下步骤1.对LiDAR点云数据建立四叉树索引,并对四叉树索引进行序列化,具体包 括以下步骤,步骤1. 1,图1为LiDAR点云数据示意图,每个黑点代表一个激光点。根据激光点 云数据包围盒范围和总点数,计算激光点云数据的平均点密度density ;所述激光点云数 据包围盒范围采用激光点云数据的包围盒的长度length和宽度width标记,总点数记为
8ptNum。计算方法见公式(1)。density = -~Pt^um(15)
length χ width步骤1. 2,根据激光点云数据包围盒的长度length、宽度width以及步骤1. 1所得 平均点密度density,计算激光点云数据分块的长度1和宽度w,以及四叉树深度d印th。计 算方法见公式(2),(3)。卜—榮m
Γ πwidthIXwXdensity ^ max_ptNum(17)步骤1. 3,利用步骤1. 2所得激光点云数据分块的长度1和宽度w对激光点云数据 进行网格分块,得到多个激光点云数据分块。激光点云分块的大小和四叉树索引深度是一组矛盾参数,要想提数据查找效率, 需要使数据分块尽可能小,以减少在一个分块中的激光点数,这样可以使得在步骤2. 2中 一个分块中进行比较判断某激光点是否在裁剪框内的次数降低;但随着分块的减小,会导 致四叉树的深度增大,这样增加了遍历四叉树的时间。因此在建立四叉树索引时,需要在分 块大小和树的深度之间进行权衡。在实际处理中,可以将分块中的最大点数设为64-512之 间,计算出四叉树深度和分块大小。如果分块深度超过12,则将四叉树深度设为12,并重新 计算分块的长度和宽度。如图2,实施例采用公式(4)对点云进行分块。得到一个4*4的网格,四叉树深度 为2。col_No = (x-bbmin_x)/w(18)row_No = (y-bbmin_y)/1步骤1. 4,根据步骤1. 2所得四叉树深度cbpth建立四叉树索引,将每一个激光点 云数据分块对应四叉树最底层的一个叶子节点,叶子节点的指针指向对应激光点云数据分 块所含激光点的真实存储位置。每个激光点云数据分块都是一个长度为1、宽度为w的矩形,计算出矩形的外接圆 圆心(cell_x,cell_y)和半径cell_r分别作为对应叶子节点的圆心和半径,并将激光点云 分块中的点数Cell_ptNum记入相应叶子节点中;从最底层的叶子节点开始逐层向上建立 父节点,直到四叉树的根节点时完成四叉树的建立;每个父节点所对应圆的圆心和半径是 其所有子节点的外接圆圆心和半径,所包含的激光点数是其子节点中的激光点数之和。步骤1. 5,将步骤1. 4中建立的四叉树索引补充为一棵完全的四叉树,将四叉树中 不包含激光点云数据的节点标记为dummy。图4是对图3中的LiDAR点云数据建立的四叉 树索弓丨,不存在数据的du_y节点就有10、17、19、20。由于激光点云的分布不规则,数据中通常还存在空洞,会造成建立的四叉树不是 一棵完全四叉树。具体实施时,将四叉树索引补充成完全四叉树的实现方式可以为,对四叉 树进行层序遍历,如果当前遍历的节点不是叶节点,则判断当前节点的四个子节点是否存 在,如果不存在则插入节点并将插入的节点标记为dummy ;如果当前遍历的节点是叶节点,
9则停止遍历。为了能够对四叉树索引采用线性化存储,在步骤1.5建立完整的四叉树之后,可 以为四叉树的所有节点编写索引号后进行序列化,即将步骤1. 5中所得四叉树中的节点按 照节点索引号顺序存储到文件中,形成线性四叉树;在步骤2. 2提取激光点云数据分块中 激光点进行绘制时,用索引号计算出相应叶节点在文件中的位置,从而直接提取激光点云 数据分块中激光点。将四叉树的节点在文件中是按序号顺序排列的,查找时可以根据节点 序号确定节点在文件中的位置,顺序排列的节点保证了在文件中按一个方向顺序查找。因 为叶节点的指针指向对应激光点云数据分块所含激光点的真实存储位置,如果查找到叶节 点,就可以直接得到叶节点对应激光点云数据分块所含激光点在文件中的位置。可以提高 绘制时,提取激光点数据的效率。由于四叉树中的每个父节点都具有四个子节点,设四个子节点将父节点所覆盖的 空间划分为四个象限。对每个象限按一定方式进行编号,即可根据子节点在父节点覆盖的 空间中的位置唯一确定其编号。实施例根据象限实现编号的实现过程如下,设定四叉树中的某个节点的索引号celljdx,其父节点索引号parentjdx,该节 点所在其父节点的象限号quadrant通过比较该节点的圆心位置(cell_x,cell_y)与父节 点的圆心位置(parent),parent_y)来计算,计算方法见(19);该节点的索引号celljdx 根据父节点索引号parentjdx及所在父节点的象限号quadrant计算得到,计算方法见公 式(20);将四叉树的根节点的编号设为0,自根节点开始,逐层向下计算各个节点的索引 号。实施例根据步骤1. 2中计算出的四叉树深度为2,按照公式(21),(22)计算出每 一个叶子节点的编号,如图3中,将节点编号标注在每个点云分块上,可见节点编号按象限 分成四组5、6、7、8,9、10、11、12,13、14、15、16,17、18、19、20,各组内又按象限进行分布。
图5为图4中的四叉树对应的线性四叉树,其中0是根节点,1、2、3、4是根节点下 一层的节点,5、6、7…20是最底层的叶子节点,其中不存在数据的dummy节点是10、17、19、 20。步骤2,利用步骤1所得四叉树索引对激光点云数据进行绘制,具体包括以下步 骤步骤2. 1,利用四叉树索引实现对激光点云数据的快速视场裁剪,实现方式为在进 行点云数据绘制时,只对落入显示区域内的激光点云数据进行绘制,即利用显示区域的包 围盒对四叉树索引进行裁剪,裁剪方法是用四叉树中节点的圆心和半径构成的圆与裁剪框 进行相交判断,如果圆在裁剪框内或与裁剪框相交,则表示该节点所包含的激光点数据全 部或部分位于显示区域内;如果圆在裁剪框外,则表示该节点包含的激光点数据在显示区 域外。如图6中,实施例用裁剪框对激光点云进行裁剪,从四叉树的根节点开始遍历,以 quadrant =
(23)
10当前节点的圆心和半径构成的圆与裁剪框进行相交判断,如果圆与裁剪框相交,则继续对 该节点的所有子节点进行裁剪。最终的裁剪结果见附图7,裁剪出的节点编号为0、2、3、11、 12、13、14,其中包含激光点数据的叶子节点编号为11、12、13、14。裁剪时从根节点开始,如果节点标记为dummy或节点在裁剪框外,则直接跳过该 节点;如果节点在裁剪框内,则继续对该节点的子节点进行裁剪直到最底层的叶节点,得到 落入裁剪框的所有节点。为了提高效率,可以先判断当前遍历到的节点标记是否为dummy。 若当前遍历到的节点标记是dummy,表明该节点中不含有激光点数据,该节点直接跳过,不 进行裁剪;若当前遍历到的节点标记不是dummy,才以该节点的圆心和半径构成的圆与裁 剪框进行相交判断。步骤2. 2,在绘制细节控制下对步骤2. 1所得剪裁结果进行实时绘制,实现方式如 下,首先,根据叶节点的半径cell_r,按公式(25)计算出叶节点投影到屏幕上的半径
screen'Rscreen = eell_r X scale(26)其中,scale为投影转换的尺度参数,由当前裁剪框范围与在屏幕上的显示窗口 大小计算得到;设裁剪框的长度为clipping_len,显示窗口长度为viewportjen,按公式 (27)计算 scale,scale = viewport_len/clipping_len(28)然后,根据裁剪得到的叶节点得到对应的激光点云数据分块,采用视觉感知驱动 的最优细节层次自动确定方法,计算出每个点云分块应绘制激光点总数draw_nUm,实现方 法为,设在屏幕上绘制的最小目标半径为miruradius,min_radius根据具体显示分辨率设 置,按公式(29)计算出为达到最优绘制细节层次,每个分块应绘制激光点总数draw_nUm,draw—num = Rscreen/min—radius(30)最后,逐块绘制与裁剪得到的叶节点对应的激光点云数据分块,如果当前绘制的 激光点云数据分块的应绘制激光点数draw_nUm大于激光点云数据分块中的总点数,则绘 制该激光点云数据分块中全部的激光点;如果应绘制激光点总数draw_nUm小于激光点云 数据分块中的总点数,则随机提取该激光点云数据分块中draw_nUm个激光点进行绘制,绘 制方式为遍历提取激光点云数据分块中的点,然后判断该点是否在裁剪框内,如果在就绘 制该点,直到已绘制的点数达到应绘制激光点数draw_nUm或者该激光点云数据分块中的 全部点遍历完。实施例将目视可区分的最小目标半径设置为1个像素,利用公式(31)、(32)、(33) 计算每个裁剪得到的激光点云数据分块中需要绘制的激光点数,并进行绘制。当激光点云 数据分块较小时,可以不遍历判断块中的点是否在裁剪框内,直接随机提取块中draw_nUm 个激光点进行绘制,这样效率较高。为了实现海量点云的实时高质量绘制,本发明实施例在绘制时采用渐进绘制技术 和渲染时间控制,实现海量点云数据的绘制,并利用外部事件监控器来监控用户输入,优先 响应用户操作,保证对海量点云数据绘制的同时能够及时响应用户操作。所述渐进式绘制 技术,是最初绘制点云数据的粗略概况,然后逐渐精化;并利用双缓冲绘制方法,每次绘制 都先绘制到后备缓冲上,然后进行前后缓冲的交换,以避免在绘制过程中出现抖动现象。渐
11进式绘制技术和双缓冲绘制方法为现有技术,本发明不予赘述。所述渲染时间控制,是通过 一个监控器来监控当前外部输入事件,当无交互请求时,则分配一段时间给渲染器进行点 云绘制,当收到用户交互请求时,则将渲染器挂起,保证优先响应用户请求。图8给出了实 施例中基于渲染时间控制的点云绘制流程图,可供实施参考当发出渲染请求,请求渲染时 间时,监控器判断是否有用户交互,无则分配渲染时间,由渲染器执行渲染,有则处理交互 请求,然后删除事件队列,等待下次判断。 本发明中所描述的具体实施例仅仅是对本发明精神作举例说明。本发明所属技术 领域的技术人员可以对所描述的具体实施例做各种各样的修改或补充或采用类似的方式 替代,但并不会偏离本发明的精神或者超越所附权利要求书所定义的范围。
权利要求
一种基于四叉树索引的海量机载激光扫描点云实时绘制方法,其特征在于,包括以下步骤步骤1,对原始的激光点云数据建立四叉树索引,具体包括以下步骤,步骤1.1,根据激光点云数据包围盒范围和总点数,计算激光点云数据的平均点密度;所述激光点云数据包围盒范围采用激光点云数据的包围盒的长度length和宽度width标记,总点数记为ptNum,激光点云数据的平均点密度density按公式(1)算得; <mrow><mi>density</mi><mo>=</mo><mfrac> <mi>ptNum</mi> <mrow><mi>length</mi><mo>×</mo><mi>width</mi> </mrow></mfrac><mo>-</mo><mo>-</mo><mo>-</mo><mrow> <mo>(</mo> <mn>1</mn> <mo>)</mo></mrow> </mrow>步骤1.2,根据激光点云数据包围盒的长度length、宽度width以及步骤1.1所得平均点密度density,计算激光点云数据分块的长度l和宽度w,以及四叉树深度depth;其中 <mrow><mi>l</mi><mo>=</mo><mfrac> <mi>height</mi> <msup><mn>2</mn><mi>depth</mi> </msup></mfrac> </mrow>(2) <mrow><mi>w</mi><mo>=</mo><mfrac> <mi>width</mi> <msup><mn>2</mn><mi>depth</mi> </msup></mfrac> </mrow>l×w×density≤max_ptNum(3)即预先设定阈值max_ptNum,每一个激光点云数据分块中的激光点总点数l×w×density不能超过阈值max_ptNum;步骤1.3,利用步骤1.2所得激光点云数据分块的长度l和宽度w对激光点云数据进行网格分块,得到多个激光点云数据分块;所述网络分块的实现方式为,设激光点云数据中某个激光点的坐标为(x,y,z),整个激光点云数据的包围盒左下角坐标为(bbmin_x,bbmin_y),则根据公式(4)计算出每个激光点所属的分块号,其中col_No为分块的列号,row_No为分块的行号,col_No=(x bbmin_x)/w(4)row_No=(y bbmin_y)/l步骤1.4,首先,根据步骤1.2所得四叉树深度depth建立四叉树索引,将每一个激光点云数据分块对应四叉树最底层的一个叶节点,叶节点的指针指向对应激光点云数据分块所含激光点的真实存储位置;每个激光点云数据分块都是一个长度为l、宽度为w的矩形,计算出矩形的外接圆圆心(cell_x,cell_y)和半径cell_r分别作为对应叶子节点的圆心和半径,并 将激光点云分块中的点数cell_ptNum记入相应叶子节点中;从最底层的叶子节点开始逐层向上建立父节点,直到四叉树的根节点时完成四叉树的建立;每个父节点所对应圆的圆心和半径是其所有子节点的外接圆圆心和半径,所包含的激光点数是其子节点中的激光点数之和;步骤1.5,将步骤1.4中建立的四叉树索引补充为一棵完全的四叉树,将四叉树中不包含激光点云数据的节点标记为dummy;步骤2,利用步骤1所得四叉树索引对激光点云数据进行绘制,具体包括以下步骤,步骤2.1,利用四叉树索引实现对激光点云数据的快速视场裁剪,实现方式为在进行点云数据绘制时,只对落入显示区域内的激光点云数据进行绘制,即利用显示区域的包围盒对四叉树索引进行裁剪,裁剪方法是用四叉树中节点的圆心和半径构成的圆与裁剪框进行相交判断,如果圆在裁剪框内或与裁剪框相交,则表示该节点所包含的激光点数据全部或部分位于显示区域内;如果圆在裁剪框外,则表示该节点包含的激光点数据在显示区域外;裁剪时从根节点开始,如果节点标记为dummy或节点在裁剪框外,则直接跳过该节点;如果节点在裁剪框内,则继续对该节点的子节点进行裁剪直到最底层的叶节点,得到落入裁剪框的所有节点;步骤2.2,在绘制细节控制下对步骤2.1所得剪裁结果进行实时绘制,实现方式如下,首先,根据叶节点的半径cell_r,按公式(5)计算出叶节点投影到屏幕上的半径Rscreen,Rscreen=cell_r×scale(6)其中,scale为投影转换的尺度参数,由当前裁剪框范围与在屏幕上的显示窗口大小计算得到;设裁剪框的长度为clipping_len,显示窗口长度为viewport_len,按公式(7)计算scale,scale=viewport_len/clipping_len (8)然后,根据裁剪得到的叶节点得到对应的激光点云数据分块,采用视觉感知驱动的最优细节层次自动确定方法,计算出每个点云分块应绘制激光点总数draw_num,实现方法为,设在屏幕上绘制的最小目标半径为min_radius,min_radius根据具体显示分辨率设置,按公式(9)计算出为达到最优绘制细节层次,每个分块应绘制激光点总数draw_num,draw_num=Rscreen/min_radius(10)最后,逐块绘制与裁剪得到的叶节点对应的激光点云数据分块,如果当前绘制的激光点云数据分块的应绘制激光点数draw_num大于激光点云数据分块中的总点数,则绘制该激光点云数据分块中全部的激光点;如果应绘制激光点总数draw_num小于激光点云数据分块中的总点数,则随机提取该激光点云数据分块中draw_num个激光点进行绘制,绘制方式为遍历提取激光点云数据分块中的点,然后判断该点是否在裁剪框内,如果在就绘制该点,直到已绘制的点数达到应绘制激光点数draw_num或者该激光点云数据分块中的全部点遍历完。
2.如权利要求1所述的海量机载激光扫描点云实时绘制方法,其特征在于在步骤1.5 建立完整的四叉树之后,为四叉树的所有节点编写索引号后进行序列化,即将步骤1. 5中 所得四叉树中的节点按照节点索引号顺序存储到文件中,形成线性四叉树;在步骤2. 2提 取激光点云数据分块中激光点进行绘制时,用索引号计算出相应叶节点在文件中的位置, 从而直接提取激光点云数据分块中激光点。
3.如权利要求2所述的海量机载激光扫描点云实时绘制方法,其特征在于由于四叉 树中的每个父节点都具有四个子节点,设四个子节点将父节点所覆盖的空间划分为四个象 限,根据象限实现编写索引号,实现过程如下,设定四叉树中的某个节点的索引号celljdx,其父节点索引号parentjdx,该节点所 在其父节点的象限号quadrant通过比较该节点的圆心位置(cell_x,cell_y)与父节点的 圆心位置(parent),parent_y)来计算,计算方法见(11);该节点的索引号cell_idx根 据父节点索引号parentjdx及所在父节点的象限号quadrant计算得到,计算方法见公式 (12);将四叉树的根节点的编号设为0,自根节点开始,逐层向下计算各个节点的索引号;
4.如权利要求1或2或3所述的海量机载激光扫描点云实时绘制方法,其特征在于 在步骤2中,通过渐进绘制技术和渲染时间控制,实现海量点云数据的实时交互;所述渐进式绘制技术,是最初绘制点云数据的粗略概况,然后逐渐精化;并利用双缓冲 绘制方法,每次绘制都先绘制到后备缓冲上,然后进行前后缓冲的交换,以避免在绘制过程 中出现抖动现象;所述渲染时间控制,是通过一个监控器来监控当前外部输入事件,当无交互请求时,则 分配一段时间给渲染器进行点云绘制,当收到用户交互请求时,则将渲染器挂起,保证优先 响应用户请求。
全文摘要
本发明提供了一种基于四叉树索引的海量机载激光扫描点云实时绘制方法,对原始的激光点云数据建立四叉树索引,并对四叉树索引进行序列化,利用建立的四叉树索引,对海量激光点云进行快速视场裁剪,并通过点云绘制时的绘制细节控制和绘制时间控制,实现海量点云的实时高质量绘制。
文档编号G01S17/06GK101908068SQ20101024513
公开日2010年12月8日 申请日期2010年8月3日 优先权日2010年8月3日
发明者张靖, 江万寿, 王建超, 郭大海 申请人:武汉大学;中国国土资源航空物探遥感中心