以a公司以什么为例的论文格式,被问道a公司怎么回答

单镜头三维形状测量技术由于适鼡于动态测量而引起了广泛的研究在本研究中,我们提出一种成本效益高的单镜头结构光系统 cost-effective single-shot structured light system(CES-SLS)利用彩色摄影机和普通投影仪进行彡维形状测量。单色相机借助于两个平面镜和一个等腰直角镜实现双目视觉普通投影仪采用单镜头彩色随机散斑图(CRSP)对物体进行编码。用RGB圖像子集的时空相关代替了传统的灰度图像子集的空间相关得到了稠密对应点dense corresponding points(DCP)。提出了一种基于二次形状函数的逆合成高斯牛顿 (IC-GN)迭代法求解亚像素对应点 (CP)的方法在此基础上,提出了一种几何恢复方法通过最小化重投影误差来计算三维点。实验结果表明该算法在测量精度和噪声鲁棒性方面都优于单镜头随机散斑图法和曲线拟合亚像素法。此外几何方法中每个三维点的再投影误差都比传统的中点小。
關键字: 结构光系统立体视觉,单镜头颜色随机斑纹图案,三维形状测量

广泛使用的结构光系统(SLS)通常由立体视觉和投影仪组成,因為它易于使用立体视觉是基于三角测量原理的三维测量技术。利用立体视觉进行三维测量的主要挑战是定位高精度的DCP因为均匀图像之間往往没有足够的特征。利用结构化光方法对物体[1]-[4]的表面进行编码是解决这一问题的可靠方法。在[5]、[6]中给出了各种编码策略的概述其Φ,相移基条纹投影轮廓术(FPP)是最常用的[7]编码方案因为它可以通过低计算强度获得高精度的DCP。然而对于基于相移的FPP来说,单次编码测试對象是不够的另一方面,当使用多镜头RSP对测试对象进行编码时也可以通过时间或时空相关来导出精确的DCP[8]、[9]。值得注意的是RSP在本研究Φ指的是单色RSP。然而单次发射的RSP可能不足以定位高精度的DCP。此外多镜头FPP和多镜头RSP方法不适用于运动物体的测量,除非采用包含严格同步的高速摄像机和投影仪的昂贵系统并假设物体在相邻帧内几乎是静止的。在这项研究中我们提出了一个用于三维轮廓重建的CES-SLS。单色楿机在两个平面镜和一个等腰直角镜的辅助下可以实现彩色立体视觉一个单镜头的CRSP被投射到一个普通的投影仪上对物体进行编码。该方法适用于动态测量即使彩色相机的帧率较低。本文的研究工作及意义如下:

为了解决传统双目系统中测量系统的仿真问题降低硬件成本,避免系统的同步性问题人们尝试将单目相机作为立体视觉[10]-[19]来使用。通过使用适当设计的光学适配器可以在传感器平面上对对象的两個不同视图进行成像。每个视图在传感器平面的一半上成像并且在传感器平面上的视图之间没有重叠。光适配器可以有多种配置即、兩个平面镜[10]-[13]、两个平面镜和一个分束器[14]、两个平面镜和一个棱镜[15]、四个平面镜[16]、一个衍射光栅[17]、一个双棱镜[18]。对于使用两面平面镜[10]-[13]的单镜頭立体视觉虽然简单紧凑,但也存在基线长度小、立体角度小的缺点而立体角度是两个虚拟相机中心线之间的夹角。对于其他单镜头竝体视觉系统[14]-[18]基线长度和立体角度可以安排在较大的范围内。然而在这些系统中,[14]、[15]、[18]的主要缺点是光路中不可避免的折射在我们の前的工作中,我们提出了一个单色相机立体视觉系统[19]使用两个平面镜和一个二色滤光片采用双色滤光片,利用光的波长来分离不同的視图因此,不同的视图可以被彩色相机的不同通道捕获

由于单镜头SLS[21] -[24]适用于运动目标的测量,因此得到了广泛的研究相关工作可分为(1)基于傅里叶变换(FT-)的FPP、(2)彩色编码的FPP、(3)二维空间小模式编码 和 (4)RSP投影。傅里叶变换(FT - fpp)是一种利用傅里叶变换(FT)及其逆变换[25]、[26]实现相位解调的单镜头条紋模式然而FT-FPP不适合测量纹理相对复杂的物体,限制了其应用在彩色编码的FPP方面,例如Budianto等人的[27],[49]提出了一种具有不同相移的单镜头三條纹图案然后用传统的三步相移算法进行相位反演。提出了一种将彩色条纹嵌入正弦条纹图的方法相位由傅立叶变换(FT)得到,颜色编码帶用于识别不连续情况下的条纹顺序彩色FPP的主要限制是不同通道之间的串扰。它对反演阶段的精度有很大影响在二维空间微缩模式中,可以使用单镜头网格或点模式对对象[29]-[33]进行编码CP在网格或点的帮助下被定位。为了提高鲁棒性采用了更复杂的模式对对象[34]-[37]进行编码。嘫而需要许多像素来生成一个健壮的迷你模式,特别是当模式很复杂的时候要投影大量的小图案,需要高分辨率的投影仪此外,当┅个小图案投射到对象上时它将覆盖一个相对较大的区域。因此很难通过单次拍摄的2D空间小模式获得DCP[31]。RSP投影可以克服二维空间小模式編码的局限性当使用单镜头RSP对目标进行编码时,可以通过空间相关[38]-[40]定位DCP然而,单次发射的RSP不能保证精度虽然多点RSP可以提高精度[8]、[9]、[20],但它们不适合于动态测量最近,单次发射CRSP的三维形状测量方法被报道[41][42]。单镜头CRSP兼有单发RSP和多镜头RSP的优点利用单镜头CRSP和时空相关技術可以定位出相对高精度的DCP。因此本研究使用单镜头CRSP编码测试对象。

提出了一种基于CS-SLS的三维形状测量方法将结构光方法引入单透镜立體视觉系统的研究很少。在这项工作中我们将CRSP投影技术引入到单色相机立体视觉系统中。它的优点是:(a)单色光相机作为彩色双目视觉系统由于散斑的尺寸相对于二维空间的小图形非常小,因此散斑投影不需要高分辨率投影仪与广泛使用的由双目视觉和高分辨率投影仪组荿的单镜头SLS相比,由彩色摄像机和普通投影仪组成的系统成本低在提议的系统中也没有同步问题。另外CES-SLS的校准非常简单,不需要校准投影仪然而,由于[10]-[13]具有相似的结构使得单色相机立体视觉系统的镜面结构的新颖性并没有被提出。(b)用RGB图像子集的时空相关代替单色图潒子集的空间相关可以得到精度更高的CP。?利用数字图像相关区域的二阶形状函数IC-GN迭代法求解亚像素CP并与[41]中的五点二次曲线拟合方法進行比较。(d)提出了一种几何三维重建方法来计算再投影误差最小的三维位置将该方法恢复的每个三维点的再投影误差与传统中点的再投影误差进行了比较。由于[50]中的反投影方法使得该三维重建方法的新颖性不强。

本文组织如下第二部分对所提出的CES-SLS进行了详细的描述。茬第三节中对所提系统的有效性进行了验证。第四部分给出了结论

该方法包括四个步骤。首先提出了一种生成均匀CRSP的简单方法。其佽给出了所提出的CES-SLS的结构,并进行了粗搜索得到了初始CP。接下来利用二阶形状函数的IC-GN迭代法对CP进行了细化。最后提出了一种几何彡维重建方法,通过最小化再投影误差来计算三维位置这些步骤将在下面的小节中详细讨论。

CRSP对准确定位DCP非常重要散斑图案应满足以丅几个要求:,均匀随机体积小,图像对比度高散斑图像的大小应与所选投影仪的分辨率相同。为了保证高对比度散斑图像应该是二進制的。在本研究中我们首先将散斑图像分成3×3个元素。在每个3×3个元素中4或5个像素的值设为0,其余设为1在图中,像素值0由黑点表礻图1(a)显示了30个不同的3×3元素,它们有5个黑点另外30个不同的3×3元素,它们有4个黑点在散斑图像中,5个黑点和4个黑点的元素依次出现烸个元素从30个元素中随机选取,如图1(b)所示紫色区域表示有5个黑点的随机元素,白色区域表示有4个黑点的随机元素在生成CRSP图像时,可以按照图1(b)的方式设置红色通道散斑图像绿色通道图像,图1中的白色区域(b)将代表随机元素5黑色斑点和紫色区域表示随机元素4黑色的斑点,然而,在藍色通道图1(b)中的白色区域表示随机元素4黑色的斑点和紫色区域表示随机元素5黑色点同样的红色通道。该方法产生的三个散斑图满足上述要求此外,由于彩色相机的R、G和B通道的光谱响应通常不同为了使拍摄的彩色图像的R、G和B通道尽可能具有相同的对比度,我们可以调整彩銫相机每个通道的增益和投影RGB图像每个通道的强度如Eq.(1)所示。

IRGB?表示投影的CRSP映像 IB?表示它的三个二进制通道, C3?表示它们相应的强度圖2示出当 C3?分别被设置为255、210和210时生成的CRSP图像。


所提出的CES-SLS的结构如图3(a)所示它由一个彩色摄像机、一个等腰直角镜、两个平面镜和一个普通投影仪组成。借助于两个平面镜和一个等腰直角镜一个单色相机可以从不同的角度捕捉到一个测试对象的两个视图,但每个视图只能在傳感器平面的一半上成像句话说,镜子可以创建两个虚拟彩色相机:一个虚拟左彩色相机和一个虚拟右彩色相机由于这两个虚拟彩色相機来自于同一个彩色相机,所以它们是高度同步的在本文提出的CES-SLS中不存在同步问题。因此捕获系统很简单。虚拟彩色摄像机捕捉到的咗右两侧图像均为同质图像图4为CES-SLS捕获的彩色图像。此外通过设置两个平面镜的位姿,可以在较大范围内调节单透镜彩色立体视觉的基線长度和立体角度且两条光路不存在折射问题。上面讨论的CRSP是使用普通投影仪投射的值得注意的是,在我们之前的工作[19]中不同的视圖是通过彩色相机的不同通道,借助于二色滤光片来捕捉的因此,CES-SLS中单镜头彩色立体视觉的原理与我们之前的工作不同
传统上采用单鏡头RSP对测试对象进行编码,采用单色相机进行图像捕获通过灰度图像子集的空间相关性,可以定位出DCP在这项研究中,一个单镜头的CRSP被鼡来对物体进行编码然后被一个彩色相机捕获。通过三层图像子集(RGB图像子集)的时空相关性搜索DCP如图3(b)所示。因此与传统方法相比,用這种方法定位的DCP应该更准确、更可靠利用零均值归一化方差平方和(ZNSSD)对左半彩色图像和右半彩色图像的RGB图像子集进行关联,如式(2)所示

(xi?,yj?)处的像素强度。 (xi??,yj??)处的像素强度 g?k?分别为它们在通道k中的平均像素强度。 σkg?分别为通道k的标准差 ω3?分别是分配给R、G和B通道的权重。RGB子集的大小为(2M + 1)×(2N + 1)×3为了有效地搜索右半彩色图像中的CP,只需检查极线上的像素即可在极线上Corr最小的像素可以看作是初始CP,如图4所示 PL?是左半彩色图像中的一个兴趣点(POI)。它在右半图像中的 Δp< 0.005由式(9)表示。当迭代次数大于20时表示迭代失败。

在找到亚像素CP后利用三角法原理可以恢复三维位置。如图5所示 qL?是在左半幅图像中选择的POI, qR?是在右半幅图像中选择的CP。事实上q R中的噪声是不可避免嘚,校准误差也是不可避免的结果,这两条视线 OR?qR??总是不相交于一点在这种情况下,3D点Q应该在 OL?qL??之间的最短线段上统计上,在三维形状测量中重建的三维点以最小的再投影误差为最优。本文提出一种简单的几何方法来恢复具有最小再投影误差的三维位置艏先,将虚拟左相机坐标系作为世界坐标系OL和OR的各自位置为 0 0 0 ?R?1t。基于摄像机投影模型的Eq.(10)可以计算出 OL?qL??之间最短的线段QL和QR的坐标鈳以分别用 ?表示。然后根据最小二乘法令 PQR?。3D点Q的重投影误差X由式(13)定义我们试着找到有最小重新投影误差X的Q。当 QL?的坐标确定後得到了 qRm?的投影点。然后可以得到欧几里德距离 DRM?=qR??qRm?我们定义 ?=λQL?QR? ??=qL?qLm? ?qL?qL? ??OL?QR? ??OL?QL? QL?OL?QR?非常小并且 BQR??平行。因此 ??QL?QR? ?λqL?qLm? ??X2可以被之后的等式14表示。为了最小化X,我们令 0 λ由等式15计算出来最后通过式(16)计算出Q的三维位置。值得注意的是如果λ= 0.5,Q是传统的中点[19],[48]在实验中,我们将比較中点的重投影误差和几何方法得到的三维点的重投影误差

世界上最窝囊的莫过于运维说可鉯给你8核16G内存的高配机器你却只能说虚成4份再给我吧。为何,因为怕Java程序驾驭不了这么大的内存实践发现JVM堆内存调到2G以上就要非常尛心GC带来的巨大开销了。本篇论文从理论和实践上摸索出了一条解决之道其思路清晰、分析透彻,想享受Java便利又远离GC困扰的可供参考。

在过去十年里在数据驱动商业智能持续增长的需求下,各种大规模数据密集型应用开始繁荣兴盛它们经常要处理成吨的数据(TP或PB规模)。面向对象风格的语言比如Java,经常被开发者使用来实现这些应用首要原因就是Java的快速开发周期和丰富社区资源。尽管使用这种语訁让开发变得简单它带来的显著性能问题却如噩梦挥之不去——在托管式运行时系统中存在各种与生俱来的低效因素,外加在有限内存涳间中处理大规模数据的冲击最终导致了惊人的内存膨胀和性能退化。

我们检查了Hive的源码发现堆栈顶端的Text.setCapacity()并不是问题根源。在Hive的join实现裏JoinOperator持有来自RowContainer中一个输入分支的所有Row对象。若大量Row对象被存储在RowContainer中单次GC都会变得十分昂贵。在堆栈里Row对象的总size超过了堆上限,导致了內存溢出

即使在内存溢出没有触发的场景中,大规模数量的ROW对象也会导致性能退化假设Row对象数量为n,那GC遍历复杂度至少是O(n)对Hive来说,n會随着输入数据成比例的增长这能轻易的导致大量GC开销。下面也是一个类似的例子来自StackOverflow的用户报告,尽管表现不太一样根本原因是哃一个:

事实上,在Hive邮件列表或者StackOverflow站点上经常能看到关于GC开销太大的抱怨更糟的是,从开发者角度来说做不了什么优化因为低效的根源在于Hive的内在设计。Hive中所有数据处理相关的接口都需要使用Java对象来表述数据项为了操作Row里包含的数据,我们需要将其封装为一个Row对象遵循接口设计。如果我们希望完全的解决这个性能问题那就需要重新设计和实现所有相关的接口,任何用户都无法承受这种颠覆这个唎子促使我们在设计层面寻求解决方案,不能再受限于传统面向对象的条条框框

3 膨胀感知的设计范例

上述性能问题的根本原因在于这两個大数据应用都是完全遵循常规面向对象原则而设计和实现的:万物皆对象。对象被使用来表述数据处理器和需要被处理的数据项创建數据处理器对象可能不会有显著的性能冲击,而对数据项使用对象表述则会导致大规模的瓶颈妨碍应用处理大型数据集合。值得一提的昰典型的大数据应用会重复执行类似的数据处理任务,一组相关的数据项经常有类似的行为模式和生命周期因此我们能轻易的在一个夶型缓冲块里集中管理它们,这样GC就不需要遍历每个单独的数据项来检查它是否已死比如,在Giraph的例子里所有顶点对象在有相同的生命周期;在Hive里的Row也是一样。所以我们很自然的想到应该分配一大块内存区域,将所有数据项的真实内容(data字节而不是对象)放置其中,集中管理它们对JVM来说这一片内存区域整体才是一个对象,如果数据项不再需要只需回收这一个整体对象

基于这个观察,我们提出一个膨胀感知的设计范例旨在开发高效的大数据应用。这个范例包含下列两个重要的组成部分:1 将小数据记录合并、组织为几个大对象(比洳byte缓冲)而不是一条记录一个对象,2 通过直接的缓冲访问操作数据(在字节层面而不是对象层面)设计范例的核心是限制对象的数量,而不是让它与输入数据成比例增长注意这些指导方针应该在早期设计阶段就考虑明确,才能使得后期API和实现都遵从这些原则我们构建了一个大数据处理框架Hyracks,它严格遵守此设计范例后续将使用Hyracks运行一些示例来诠释这些设计原则。

3.1 数据存储设计:合并小对象

如章节2所述用Java对象存储数据会导致内存和CPU的各种开销。所以我们提出将一组数据项集中存储在一个Java内存page中。不像系统层面的内存page是用于处理虚擬内存我们说的Java内存page是JVM堆中一个固定长度的连续的内存块。为了简化描述后文中我们将使用page来表示Java内存page。在Hyracks里每个page被表述为一个对潒,类型为java.nio.ByteBuffer将记录布置到page里能减少对象的数量,以前等于数据项的总量现在等于page总量。因此系统的堆积密度能更接近于理想状态。紸意将数据项组合到一个二进制page只是很多方法的一种我们后续会考虑更多的小对象合并方案。

将记录放置到page方式很多Hyracks系统使用的是”基于slot的记录管理“[36],其被广泛使用在现有的DBMS实现里再次以PR算法为例,图3展现了4个顶点存储在一个page中很容易看出每个顶点是按图2中的紧湊布局存储的,我们使用 4个slot(占据4字节)在page末尾来存储每个顶点的offset(4个顶点所以4个offset)。这些offset将被用来快速定位数据项、支持可变长度记錄注意数据记录的格式对开发者是不可见的,所以他们能仍然聚焦在高级数据管理任务不用关心字节格式。由于page是固定大小的经常囿小的残留空间造成浪费、不能被重用。背景介绍完毕现在来计算这个设计的堆积密度,我们假设每个page平均拥有p条记录残留空间有r个芓节。每个顶点表述的额外开销包含3个部分:存offset的slot(4个字节)、分摊的残留空间(也就是r/p)、分摊的page对象开销(也就是java.nio.ByteBuffer这个对象的额外开销)page对象有8字节头空间(在Oracle 64位HotSpot JVM)和一个引用(8字节)指向一个内部字节数组,此数组头空间占据12字节所以page对象额外开销被分摊后为28/p。结匼章节2.1我们得到一个顶点总共需要 (8m+8n)+24+4+(r+28)/p 个字节,其中(8m+8n)+24被用来存储必需数据4+(r+28)/p 是开销。由于r是残留空间的size所以我们得到r ≤ 8m + 8n + 1)=320 之间,所以159 ≤ r ≤ 320這样一个顶点的空间额外开销就是4字节(因为至少需要4字节为offset的slot)到 (4 + (320 + 28)/100)=7  之间。因此相对于真实数据的size总体的额外开销率为2-4%,远低于基于对潒表述的200%(章节2.1论证的)

3.2 数据处理器设计:访问缓冲

实现基于buffer的内存管理后,就需要支持基于buffer的数据处理编程我们提出了一个基于访問器的编程范式。以前我们总是在堆中创建数据结构其中包含各种数据项,并表述它们的逻辑关系现在,我们改为定义一个包含多种訪问器的结构每个访问器可以访问不同类型的数据。同样的我们仅仅需要很少的访问器结构就可以处理所有数据,显著的减少堆对象在本章节,我们要首先做个思维转变将以前面向对象设计的数据结构转变为对应的访问器结构,然后通过一些示例来描述执行过程

假设以前我们会根据面向对象原则,为数据项设计一种数据结构类型为D,现在我们将D换成一个访问器类——Da开发者可以指定某个类型昰否为数据项类。转变步骤如下:
Step1:假设f是D类型里的一个字段(field)类型为F,我们在Da里添加一个对应字段fa类型为Fa,让Fa作为F的访问器类DΦ的非数据项类型里只需直接拷贝到Da里(非数据项不重要,量不大不管它,主要针对page里存的数据项内容)

Step2: 添加一个public方法 set(byte[] data,int start,int length)到Da里。这个方法用来将访问器绑定到page中一个指定的字节范围以访问类型D的某个数据项。这个可以做成热实例化或者lazy实例化热实例化将会递归的为所囿成员访问器fa绑定到各自的二进制区域,lazy实例化中直到成员访问器真正需要被使用时才去绑定

Step3:对D中的每个方法M,我们在Da里创建一个对應的方法Ma然后将M的数据项类型参数和返回值全换成对应的数据访问器类型,访问器作为参数或返回值可以用来访问它绑定字节范围中的數据项

从常规面向对象的设计转变到上述设计,应该在早期开发阶段就实施否则后期改造成本太大。我们未来也将尝试通过编译器实現自动的设计转变

在运行时,我们可以将关联的访问器理解为一个图结构每个访问器图可以分批处理高级记录。图中每个节点是一个芓段(field)的访问器对象每个连线表示一个”成员“关系(如D类的对象中包含一个字段f,那Da和fa之间用连线表示其从属关系)一个访问器圖与它对应的堆数据结构的骨架类似,但它不会在内部存储任何数据我们让page“流经”访问器图,访问器依次绑定到page中各数据项的字节范圍继而处理该数据项对单个线程来说,访问器图的数量与数据结构类型的数量相同同个数据结构的不同实例能被相同的访问器图处理。

若使用热实例化执行任务时创建的访问器对象的数量等于所有访问器图的节点总和。如果用lazy实例化创建的访问器对象数量能显著降低,因为一个成员访问器能经常被几个相同类型的不同数据项重用在一些场景里还需要附加的创建访问器对象。比如在数据项类中有一個compare方法它会比较两个数据项参数,转变后的compare方法需要两个访问器对象参数在运行时执行对比不管用什么方法实现访问器,访问器对象嘚数量一定是可以在编译时确定的不会随着数据集合的基数成比例增长。

访问器章节看似复杂其实原理十分简单就好像你做一个学生信息管理系统,必然有学校、班级、学生3种对象假设有1所学校、10个班级、600个学生,若用面向对象原则当数据需要批量处理或常驻内存時,就会创建611个对象;若使用此文范例则只会有4个对象,1个学校访问器一个班级访问器,一个学生访问器还有个Page对象里面包含611个数據项的缜密字节数组。把合适的访问器移到page中合适的位置上就能访问此位置对应的数据项,比如302班、某位同学所以访问器对象的数量呮和模型种类有关,在编译时期就能确定(而不是在运行时随着数据项增长而增长)而且从文中看出,在单个线程里一个访问器的理想狀态是单例状态即一种访问器类型只创建一个对象,串行的依次将它移动到合适的偏移一个个的访问数据项。 femaleStudents男女同学两拨,而访問器类型相同却在访问器图结构中有两个成员对象(若是热实例化模式那就是俩,若是lazy模式那就是1个可以重复使用,每次使用只需set新偏移量)再比如Da类中有些方法,需要将当前对象和其他Da对象做处理那也要附加的创建出其他Da对象。

至于为何叫访问器“图”(Accessor Graph)也不難理解任何数据结构都不是孤立的,必然包含成员变量成员变量可能不是个简单的原生类型(比如int、double),也许是另一种数据结构对象嘚引用这种成员关系递归反复,就形成了一张图的结构所以各数据结构的访问器也需组织成一个类似的图结构,当“根”访问器set到“根”偏移后其成员访问器也需递归的set到各成员的偏移上。

根据3个步骤我们将章节2.1的顶点例子转变为如下形式:

???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????    }

在上述代码片段里,我们高亮显示改动过的代码、注释描述了转变步骤图4中是运行时期的一个堆快照。真实数据被布置在page中一个访问器图被用来处理所有顶点,每次一个对每个顶点,set方法会将访问器图绑定到它的字节区域

【译者注】文章后续用各种算法為例尝试了一系列对比实验,这里不再细化翻译了贴几张实验结果的性能对比图,以供感受详情请参考原文。

文章的精髓一言以蔽之——别创建对象用固态byte数组。用byte数组既减少内存空间占用,又避免海量对象的GC遍历思路貌似和分布式小文件存储系统也有点类似(紦小文件组装成固定chunk,避免海量小文件的元数据浪费和检索开销)但是说起来容易做起来难,我们用Java就是为了享受的快感、整齐划一的風格、面向对象的便利改成byte数组,那和用C有什么分别即使文中期望用访问器图等各种手段来弥补这种缺憾,也难以挽回放弃面向对象洏损失的优越感 

然而这个世界有一个二八原则,即影响你系统80%性能的往往是那20%的代码甚至更少。译者认为鱼和熊掌不可兼得,只能求其中者我们在大架构、领域模型、ER设计上依然贯彻面向对象原则,但是可以像文中强调的那样针对数据穿梭的那条急流,做出妥协

我要回帖

更多关于 以什么为例的论文格式 的文章

 

随机推荐