一种基于引擎模块化的全平台三维重建代码处理方法转让专利

申请号 : CN201911060242.9

文献号 : CN110865800B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 朱建科李洋杨雨

申请人 : 浙江大学

摘要 :

本发明公开了一种基于引擎模块化的全平台三维重建代码处理方法。计算引擎模块,对系统代码中的通用并行计算代码进行封装;渲染引擎模块,将系统代码中的所有与渲染执行相关的系统代码作为渲染代码进行封装;内存管理模块,采用统一接口对CPU与GPU内存统一管理,实现计算引擎模块和渲染引擎模块的多模块间的内存互通互用,各模块在内存级层面直接连通;动态物体的三维重建时,程序代码通过内存管理模块统一处理三维重建数据。本发明方法通过三个模块化解耦传统三维重建代码中逻辑与系统相关代码,从而有效地解决了三维重建需要在不同平台有不同实现的技术问题。

权利要求 :

1.一种基于引擎模块化的全平台三维重建代码处理方法,其特征在于:封装有三个模块,分别为计算引擎模块、渲染引擎模块和内存管理模块,在计算引擎模块,对系统代码中的通用并行计算代码进行封装,使得通用并行计算代码和逻辑代码解耦;

在渲染引擎模块,将系统代码中的所有与渲染执行相关的系统代码作为渲染代码进行封装,使得该部分的系统代码从三维重建代码中解耦;

上述各个模块的系统代码封装后形成API接口进行,程序运行时调用API接口进行处理工作;

将系统代码中的所有与渲染执行相关的系统代码作为渲染代码进行封装,将这部分代码进行封装并采用函数构成API接口,对系统代码中的通用并行计算代码进行分装并采用函数构成API接口;

在内存管理模块,采用统一接口对CPU内存与GPU内存进行统一管理,实现计算引擎模块和渲染引擎模块的多模块间的内存互通互用,使得各模块在内存级层面直接连通;

在进行动态物体的三维重建时,采用计算引擎模块的通用并行计算代码结合逻辑代码形成程序代码;采用渲染引擎模块的渲染代码结合逻辑代码形成程序代码;程序代码通过内存管理模块统一处理三维重建数据;

所述逻辑代码是指三维重建逻辑层面的,与平台无关的代码,在所有平台通用的代码;

不同平台实现的同一种三维重建的算法相同,逻辑代码相同。

2.根据权利要求1所述的一种基于引擎模块化的全平台三维重建代码处理方法,其特征在于:所述的渲染引擎模块和计算引擎模块相互独立的,渲染引擎模块和计算引擎模块均连接内存管理模块并经内存管理模块调用处理异构内存构架中的三维重建数据,进行渲染引擎模块和计算引擎模块之间的交互、内存共享。

3.根据权利要求1所述的一种基于引擎模块化的全平台三维重建代码处理方法,其特征在于:所述的内存管理模块,采用对象GPUBuffer()对异构内存访问进行统一接口封装处理。

4.根据权利要求1所述的一种基于引擎模块化的全平台三维重建代码处理方法,其特征在于:所述的计算引擎模块、渲染引擎模块和内存管理模块中均为系统代码,均不包含逻辑代码。

说明书 :

一种基于引擎模块化的全平台三维重建代码处理方法

技术领域

[0001] 本发明涉及软件工程的设计模式领域,设计了一种适用于动态物体三维重建代码在全平台上一次性实现的设计模式,例如解决了在安卓、IOS等不同系统平台上的通用性问
题。

背景技术

[0002] 随着AI技术的蓬勃发展以及新型设备的不断涌现,三维重建成为计算机图形学领域的热点研究课题。主要任务是基于各种传感器采集的数据,采用多视图几何、概率统计学
和优化理论等数学工具,对现实物理世界进行三维建模,建立起现实世界和虚拟世界的桥
梁。
[0003] 室内场景的三维重建技术的发展依赖于所使用的传感器的种类和性能的更新迭代,主要分为两大类:基于激光的三维重建和基于视觉图像的三维重建。基于激光的三维重
建由于无法得到环境的颜色信息,且成本高昂,因此无法实现商业化。基于视觉图像的三维
重建利用成本较低的传感器,就可以达到较高的三维重建精度,且具有丰富的颜色信息,是
当前的研究热点。
[0004] 基于视觉图像的三维重建由于其有很大的计算量,因此需要借助GPU加速计算才能达到良好的效果。这就带来了一个新的问题,为了提高三维重建的效率,需要在实现三维
重建的逻辑代码中调用许多与GPU相关的程序接口(如OpenGL)以及面向异构平台的框架
(如OpenCL),将这部分与系统资源相关的代码称为系统代码,系统代码的作用为让程序进
行高度并行的计算,来达到GPU加速的目的。由于不同平台(如Windows、Linux、MacOS、
Android、iOS等平台)对应的系统代码不同,而目前三维重建代码的实现将逻辑代码和系统
代码杂糅在一起,若要实现一个三维重建方法在不同平台的实现,为了修改系统代码将会
引起整个代码逻辑的修改,增加了许多不必要的计算工作,使三维重建在不同平台的实现
变得繁琐、冗余,针对这一问题,本发明设计了一种设计模式。

发明内容

[0005] 为了解决技术背景中存在的问题,本发明提出了一种设计模式可以有效解决三维重建代码在不同平台需要有不同实现的问题,有效解决了同一功能计算机代码在安卓、IOS
等不同系统平台上的通用性问题,适用于动态物体三维重建代码在全平台上一次性实现。
[0006] 本发明提出的方法通过三个模块化设计实现了三维重建中的逻辑代码和系统代码的有效分离,其中三个模块分别为计算引擎模块、渲染引擎模块和内存管理模块。
[0007] 下面将对本发明的技术方案做详细的说明:
[0008] 本发明技术方案中封装有三个模块,分别为计算引擎模块、渲染引擎模块和内存管理模块,
[0009] 在计算引擎模块,对系统代码中的通用并行计算代码进行封装,使得通用并行计算代码和逻辑代码解耦;
[0010] 在渲染引擎模块,将系统代码中的所有与渲染执行相关的系统代码作为渲染代码进行封装,使得该部分的系统代码从三维重建代码中解耦;
[0011] 在内存管理模块,采用统一接口对CPU内存与GPU内存进行统一管理,实现计算引擎模块和渲染引擎模块的多模块间的内存互通互用统一管理,使得各模块在内存级层面直
接连通提高速度;
[0012] 在进行动态物体的三维重建时,采用计算引擎模块的通用并行计算代码结合已经预编写好的逻辑代码形成程序代码;采用渲染引擎模块的渲染代码结合已经预编写好的逻
辑代码形成程序代码;程序代码通过内存管理模块统一处理三维重建数据,达到高效地、可
重用地、易管理的的三维重建实现。
[0013] 由上述方案本发明针对动态物体的三维重建代码计算机编程技术处理提出了一种模式,使用这种模式可以解耦三维重建代码中的逻辑代码和系统代码,解决三维重建代
码的跨平台实现。通过统一化并行计算设备内存管理模块关联计算引擎和渲染引擎的通
讯,从而使三维重建的逻辑代码与系统代码有效分离。
[0014] 所述的渲染引擎模块和计算引擎模块相互独立的,渲染引擎模块和计算引擎模块均连接内存管理模块并经内存管理模块调用处理异构内存构架中的三维重建数据,进行渲
染引擎模块和计算引擎模块之间的交互、内存共享,实现GPU与CPU异构内存结构的高效代
码程序。
[0015] 上述各个模块的系统代码封装后形成API接口进行,程序运行时调用API接口进行处理工作。
[0016] 所述的内存管理模块,采用对象GPUBuffer()对异构内存访问进行统一接口封装处理。
[0017] 所述的三维重建代码包含逻辑代码以及计算引擎模块、渲染引擎模块和内存管理模块中涉及的系统代码。计算引擎模块、渲染引擎模块和内存管理模块中均不包含逻辑代
码。
[0018] 本发明的系统代码是指与系统平台相关的代码,如CUDA、OpenGL,OpenCL等相关系统相关API都属于系统代码,调用了系统底层的指令集。不同平台上使用不同系统相关API
实现三维重建的系统代码不同。
[0019] 本发明的逻辑代码是指三维重建逻辑层面的,与平台无关的代码,在所有平台通用的代码。不同平台实现的同一种三维重建的算法相同,逻辑代码相同。
[0020] 本发明与背景技术相比,具有更有益的效果:
[0021] 本发明通过三个模块化设计,将三维重建代码中的系统代码进行封装,解耦了传统三维重建代码中算法逻辑与系统相关代码,从而有效地解决了三维重建的跨平台实现问
题。
[0022] 本发明方法通过三个模块化,解耦传统三维重建代码中逻辑与系统相关的代码,从而有效地解决了三维重建需要在不同平台有不同实现的问题。

附图说明

[0023] 图1为三维重建的模块化实现流程图;
[0024] 图2为三维重建结果示例,左侧为输入的2D图片,右侧为重建出的3D模型。

具体实施方式

[0025] 本发明适用于绝大多数三维重建,下面将结合一种三维重建方法对本发明的具体使用进行清晰、详细、完整的描述。
[0026] 如图1所示,本发明针对三维重建代码的处理建立有三个模块,分别为计算引擎模块、渲染引擎模块和内存管理模块,原始的三维重建点云数据输入三个模块,最后输出结果
数据。
[0027] (1)渲染引擎模块:
[0028] 在三维重建中,对重建得到的三维模型(包括三维坐标、纹理等信息)进行渲染得到物体或环境的2D数据图像,其中渲染部分的实现需要调用OpenGL/D3D/Vulkan来实现,属
于系统代码,对于不同平台实现方法不同。传统的三维重建处理的实现是将与渲染有关的
逻辑代码和系统代码混合编写,当要在不同平台上实现时,为了修改系统代码部分需要修
改整个代码的代码逻辑,这使得同一三维重建实现方法的跨平台实现变得异常困难。
[0029] 本发明构建了渲染引擎模块,将系统代码中的所有与渲染执行相关的系统代码作为渲染代码进行封装,其中大部分是与OpenGL/D3D/Vulkan相关的代码,将这部分代码进行
封装并采用函数构成API接口,使得渲染内容与三维重建代码解耦。
[0030] 例如针对OpenGL的渲染引擎模块,以枚举的数据结构封装了OpenGL/D3D/Vulkan的函数,以下函数将在具体实施方式中使用:
[0031]
[0032] (2)计算引擎模块:
[0033] 三维重建代码中还包含有大量的通用并行计算代码,这部分代码使用OpenCL/CUDA的并行计算机制进行实现,属于系统代码。
[0034] 在传统的三维重建代码处理中,将三维重建逻辑代码和并行计算系统代码写在一起,不进行严格的分离,使得三维重建的跨平台实现变得困难。
[0035] 因此,本发明构建了计算引擎模块,对系统代码中的通用并行计算代码进行分装并采用函数构成API接口,使得通用并行计算代码和逻辑代码解耦;
[0036] 例如针对OpenGL的计算引擎模块,以枚举的数据结构封装函数,以下函数将在具体实施方式中使用:
[0037]
[0038]
[0039] (3)内存管理模块:
[0040] 渲染引擎模块和计算引擎模块相互独立的,渲染引擎模块和计算引擎模块均连接内存管理模块并经内存管理模块调用处理异构系统内存中的数据,进行渲染引擎模块和计
算引擎模块之间的交互、内存共享,实现GPU与CPU异构内存结构的高效代码程序。
[0041] 内存管理模块中,采用固定函数对内存访问系统代码进行处理形成一种数据结构并形成API接口,采用数据结构用于管理GPU内存,代码涉及的图像数据、OpenGL/D3D/
Vulkan以及OpenCL/CUDA相关的数据都使用这一数据结构。通过内存管理模块的调用API接
口管理GPU内存,实现渲染引擎和计算引擎模块之间的交互以及内存共享。
[0042] 内存管理模块封装的部分函数如下,以下函数将在具体实施方式中使用:
[0043]访问限制 函数名称 功能
public GPUBuffer() 构建函数,创建一个GPUBuffer实例
[0044] 本发明的具体实施例及其实施情况是:
[0045] 在动态三维重建中,将输入动态图像对应的多帧图片的RGB颜色信息以及深度信息,通过三维重建,输出动态场景的3D模型(包含场景的坐标位置、颜色、纹理等)。具体的,
三维重建的思路为:对于每一帧图片根据深度图得到初始3D模型,将每一帧的3D模型融合
将得到一个融合模型,计算当前帧3D模型相较于上一帧融合模型运动情况的运动参数,并
将当前帧3D模型与上一帧融合模型进一步融合,更新融合模型。即三维重建的目标就是得
到最终的融合模型,以及每一帧3D模型相较融合模型的运动参数。
[0046] 假设输入一动态场景下的10帧图片,需要对这一动态场景进行三维重建。对于每一帧图片,将输入图片的颜色信息(RGB信息)以及深度图,根据这些信息即可对场景进行三
维重建。
[0047] 首先,根据输入的深度图对数据进行预处理,将2D图片按相机参数信息转化为3D。在这个过程中,调用了计算引擎模块,具体地调用CL_DEPTH_PROCESSING进行数据预处理,
根据相机内参信息将2D图片转为3D模型(包含物理的坐标位置、颜色、纹理等)。在预处理过
程中,需经常调用内存管理模块,具体地使用了GPUBuffer()构造函数,将预处理所需的信
息(如深度图、深度图的长宽等)以及预处理的运算结果3D模型存到内存管理模块中,从而
避免逻辑代码与系统代码的混合使用。
[0048] 经过数据预处理得到当前帧的3D模型之后,计算当前3D模型相对于上一帧融合模型运动参数。在这里需要调用渲染引擎以及计算引擎模块,其中渲染引擎模块,调用ICP_
PROJECT_CL将所融合的模型渲染到2D数据结构。在计算引擎模块,调用CL_COST_TERM来计
算当前3D模型与融合模型匹配的损失值。
[0049] 计算3D模型的运动参数之后,需要将当前帧的3D模型与上一帧得到的融合模型做进一步融合,得到最新的融合模型。同样的需要调用渲染引擎和计算引擎模块。在渲染引擎
模块,调用了FUSION_PROJECT_CL将融合模型投影到2D图中。在计算引擎模块,调用CL_FUSE
融合当前模型和融合模型,得到最新的融合模型。
[0050] 最后,在融合的过程中,将会融入一些噪声以及错误的数据,需要删除噪声来精简模型。在这个过程中,需要调用计算引擎模块。首先调用CL_FILTER_STABLE和CL_ED_DELETE
过滤所有三维数据,删去有问题的数据。
[0051] 在以上所有实现中,都需要调用内存管理模块,读取或存储当前所需的数据,并将最终的计算结果储存在内存管理模块中。
[0052] 通过上述实施例可以看出,在三维重建的过程中需要多次调用渲染引擎模块、计算引擎模块以及内存管理模块,通过将这三个模块进行封装,可以使代码逻辑更加清晰,增
加代码的可重用性、鲁棒性以及可扩展性。