[译]Multi-View Stereo: A Tutorial(3)

chapter 3 基于图像一致性的三维重建

基于第二章的图像一致性算法,本章将会详细介绍最近几年流行的多视角立体几何算法。区分MVS算法有许多因素,例如图像一致性函数,场景表达,可视化计算和初始化条件。因此提出一个单独的分类并不容易。本文将会依据输出的场景表示方法作为主要分类方式。因为它决定了应用的场景,有兴趣的读者可以参考[165]查看mvs算法的分类方法。
Fig3.1 表示4种常用的表示方法:深度图、点云、体素场、mesh面片,本章将会介绍每种重建算法的state-of-the-art 方法。点云重建方法的渲染方式是采用基于点的渲染技术[160,83],展示了一个完整的纹理渲染模型,但是点云模型仅仅是独立的带颜色的3D点;体素场常用于计算机视觉和计算机图形学表示3D平面,常将体素场当成距离一个平面的带符号的距离函数,该平面是函数场的零势面。
Fig3.2表示MVS算法的重建步骤和中间或者最终几何形态类型,许多MVS算法集中于单个重建步骤,然而有些将多个步骤组合成操作管线,本表表达了大多数MVS算法/系统,除了一种算法-直接通过图像一致性体素构建mesh,通过体素融合方法[190,102],在这个方法中,图像一致性体素替换了点云图或者深度图。
当然有许多过去开发的算法再这里没有列举出来,例如level-set方法,level-set曾经在MVS算法中非常流行,因为它能处理拓扑结构的变化[58],典型的重建步骤是初始化模型然后进行优化,拓扑结构的初始化可能是不正确的,然而level-set不再被使用因为更好的初始化或者重建算法(见本章)已经被开发出来。高质量的模型和正确的拓扑结构能够直接通过图像一致性获取,因此就不需要优化过程。同样的早些时候许多算法基于visual hull初始化mesh形态,然而最新也不再使用,因为形状的提取过程通常需要人工手动提取,visual hull 不再是有效的近似或者对于有许多凹面的结构情况不再有效,更好的初始化重建技术发展也加速就有方法的淘汰。[注全自动的形态提取方法见47,49,50]。


MVS算法可以采用输出场景表达进行分类,四种流行的表示方式是深度图、点云图、体素场和mesh面片,注意稠密的点云看起来像带纹理的mesh模型,虽然只是一些3d点云,重建出来的示例来自MVS中的state of art从上到下依次来自于[48] [74] [94] [93]

*** 3D表达和应用 ***
表3.1总结了四种场景表示方法在三种流行应用中的可行性分析,3D重建的主要应用是在图形学中(可视化),同时表格列出了两种不同的可视化应用。基于视图的纹理映射技术依赖于渲染相机视角改变图像的渲染,该技术产生沉浸式的可视化体验,由于渲染主要基于实时图像,并且能传递复杂的广度效果例如镜面高光或者透明半透明,这些都是很难去模拟的[54,68,170],谷歌街景[81]是一个很好的基于视图纹理映射技术的例子,但是,为了避免渲染伪影,渲染摄影机必须靠近输入图像。渲染摄影机的运动范围严重受限于输入照片的覆盖范围。深度图表达方式对视图的纹理映射技术及其有效,因为它的几何形状可以优化渲染每一个透视图[127].天空的建模对于室外场景的可视化很有挑战,因为几何形状难以描述不容易重建,深度图为了达到更好的渲染效果可以为每个透视图生成几何代理,对Mesh、点云,体素来说并不容易,因为他们是独立于视图的。
另一方面,自由视点渲染运行在空间自由移动,对于导航和浏览目的的应用更友好,google地图就是很好的例子,然而渲染通常独立于视图并且缺少真实感。对于自由点渲染方法,mesh或者点云更合适,纹理映射的MVS mesh方法已经成功应用在城市户外可视化产品中[30,108,144]。基于点的渲染技术已经应用于计算机图形学中[83],高质量的可视化点云或者深度图(也可以做点云处理[69,117,104])产生高质量的可视化结果。然而对于MVS生成的点云有很少的工作集中在基于点云的渲染方法,MVS点云常有噪点和重建出来的孔洞,渲染质量会严重降低。
最后的应用是几何操作。随着MVS技术的发展和重建的场景越来大,越来越复杂,几何操作功能越来越重要。为了完成一个场景的模型,处理多个MVS重建结果是必须的。对于这项任务mesh表示方式存在很大的挑战,因为通过合并和拆分来控制网格的拓扑结构很困难,所以会有几何操作方式。
在图3.2中,抛光体素(体积标量场)和mesh网格在图的底部。但是这可能不是每个MVS系统目标。 例如,如果依赖于视图的纹理映射
应用程序,应该简单地选择深度图重建算法。如果是自由视点渲染应用程序,则可以从图像进行点云重建,然后可以对应用程序使用基于点的渲染技术,而无需运行图中的任何其他步骤。 当然,高质量的多边形mesh网格模型通常是首选的场景表示,并且所有处理都归于图中的网格重建。

*** Evaluations ***

MVS研究人员进行了定量评估以验证MVS算法的准确性[165,176]。 Seitz, Curless, Diebel,
Scharstein和Szeliski在2006年为MVS定量评估奠定了基础[165],该评估在具有低分辨率(640×480)图像的两个物体数据集上评估MVS算法,这些数据集是在具有一定照明的实验室环境中仔细获得的。此评估称为Middlebury MVS评估。虽然低分辨率图像的使用可能无法反映现代消费市场中高分辨率数码相机的存在,但它具有最小化校准误差影响的优点:更高的图像分辨率需要更精确和可重复的机械装置(例如机器人手臂)。几年后,Strecha,Hansen,Van Gool,Fua和Thoennessen发布了互补的MVS基准数据集和评估系统,重点关注室外场景和高分辨率输入图像,这反映了MVS研究的趋势和需求[176]。许多算法在重建精度方面令人印象深刻(例如,在640×480图像的20cm体积内0.5mm精度),并且还产生了引人注目的3D模型,包括本章中介绍的所有最优的算法。
一个缺失的评估是重建模型的视觉质量。Middlebury MVS 评估揭示了这样一个事实, 即纯几何量化指标并不总能反映模型的视觉质量。 换句话说,具有清晰视觉伪影的模型有时会获得更好的几何精度。 最近的MVS算法产生视觉上高质量的3D模型,不仅是几何精度[164,167]。 未来的MVS评估应该同时考虑几何精度和视觉质量。
现在我们为四个输出场景表示提供MVS详细的重建算法细节。

3.1深度图重建

由于灵活性和可扩展性,深度图场景表示是最受欢迎的选择之一。 假设一个人被给予成千上万的图像和相机参数作为输入。 人们可以简单地为每个输入图像重建深度图,可能在找到要一起用于照片一致性评估的少量相邻图像之后。 通过将深度图视为3D点的2D阵列,可以将多个深度图视为合并的3D点云模型。 该处理简单并且可以容易地扩展到大量图像。

MVS中的深度图重建通常在狭窄的基线假设下进行,其公式与传统的两视图立体声相同[162]。该方法采用一组图像
摄像机参数,将有效深度范围离散为有限集深度值,然后重建参考图像的3D几何。
对于简单和紧凑的物体,均匀深度采样可能就足够了。
但是,对于复杂和大型场景,适当的采样方案是对于实现高速和高质量至关重要。研究人员提出了对样本深度的透视校正或对数参数化
值,详情参见论文[203,104,75]。然而,MVS深度图重建算法往往比它们的两个视图立体声对应物更简单,因为通常有一个
更多的图像,从而更多的冗余。换句话说,在MVS的上下文中,单个深度图的完整性并不重要只要合并的模型准确完整。
在本节的其余部分,我们将描述几个细节代表性的MVS深度图算法,然后再谈几个先进的技术。

3.1.1 winner-takes-all depthmaps(赢者通吃)

假设给出一个需要计算深度的参考图像,一组相邻图像以及应该包含需要重建场景的深度值范围。一个简单的深度图重建算法是评估整个深度范围内的图像一致性值,每个像素独立选择图像一致性得分最高的深度值,这被称为“赢家通吃”方法,如图3.3所示。
其中NCC作为图像一致性测量方法,并且预计在正确的深度处具有最大值。Algorithm1中给出了完整的算法描述。除了具有最高图像一致性的深度值之外,该算法还经常评估置信度测量,使低置信度深度值在之后的模型合并步骤[106]中可以忽略或减小权重。这个简单的算法首先由Hernández和Schmitt [93]证明并且效果出奇的好。 该算法已经进行了各种改进,接下来我们将注意力转向更复杂的方法。

3.1.2 Robust Photo-Consistency Depthmaps(鲁棒性)

虽然算法1运行得相当好,但总的来说并不能保证匹配窗口在物体表面上是唯一的。更大的窗口尺寸更可能导致匹配的唯一性,然而,对应的峰值区域将更大且不容易定位,降低了深度估计的准确性。遮挡和非朗伯光度效应如镜面反射高光也为照片一致性功能添加噪音。 因此,简单地使用式(2.3)中的平均值可能效果不佳(见图3.4)。Vogiatzis,Hernández,Torr和Cipolla[190]提出了一种强大的图像一致性功能来克服这些挑战。具体来说给出某像素的根据参考图像和每个临近的图像的计算出来图像一致性曲线,算法首先从所有照片一致性曲线中计算局部最大值。dk -- 深度值,Ck 对应的图像一致性数值的第kth个最大值,鲁棒图像一致性函数为:
********* func **********
W是核函数 -如高斯函数[190], 作用如图Fig3.4所示,简单的平均值方法选择错误的深度作为全局最大值,而鲁棒的图像一致性成功地抑制了异常值。fig3.5说明噪声点是如何被该方法抑制的。另一种更简单但有效的方法是忽略低于某一阈值的光电一致性分数。Goesele,Curless,而Seitz只是计算成对照片一致性的平均值忽略低于某个阈值的值后得分[80]。这样的阈值处理是一种非常敏感的操作,结果严重依赖于参数选择,一般是NCC的光照一致性众所周知,在不同的输入中,它是非常强大和稳定的数据。因此常使用常数值阈值来计算NCC得分。采用类似的照片一致性功能处理点云重建框架,具体细节见3.2.1节。
Fig3.6 是鲁棒性算法的重建结果 by Goesele, Curless, and Seitz [80]顶行显示左侧的示例参考图像,以及两个不同的重建深度图右边深度置信度的阈值。深度估计当置信估计低于阈值时,丢弃像素。左深度图的阈值更严格(更高),因此,噪音较小但观察到更多的洞。请注意深度图通常通过转换估计的深度将其可视化为图像将值转换为有效的图像强度。然而,在该图中,深度图被可视化为阴影多边形模型,其通过a获得简单的体积融合技术[52](参见第3.3节)。数据集由24个图像组成,他们重建了24个图像深度贴图,然后将它们合并为一个多边形模型相同的融合技术,其结果显示在底行。一个单个深度图非常嘈杂,包含很多洞,但合并后模型变得更清洁,并且展示出更少的重建孔。该输入图像数量对重建质量的影响是如图3.7所示。拥有超过300张图像,寺庙模型变得完整,而恐龙模型仍然有一些漏洞均匀的纹理,使照片一致性评估更多具有挑战性的。

3.1.3 MRF 深度图(MRF Depthmaps)

尽管使用了如上一节所示鲁棒图像一致性函数,但在特殊情况下图像一致性曲线的峰值可能与实际深度不匹配。如存在严重遮挡的情况下,大多数情况下图像中可能不存在对应的匹配。这些问题的标准解法是:在相邻像素具有相似深度值的假设下强制使用空间一致性,其中马尔可夫随机场(MRF)对于求解该任务非常成功。 MRF深度图公式[120]可以被看作组合优化问题,其中输入深度值被离散化为有限的深度值范围集合。 然后问题是从标签集中向每个像素p设置一个深度标签kp,同时最小化以下损失函数

第一个求和公式是在图像所有像素上求和,第二个是在所有相邻像素上,相邻像素可以表示为N,相邻像素可以分为4-邻域和者8-邻域,前者是在水平、垂直相邻像素上;后者同时包含对角相邻像素。4邻域系统具有较少的交互项并且更简便,但可能受到更多离散化的影响。接下来讨论下unary potentials phi(.)和pairwise interaction potentials psi(.,.)

*** unary potentials ***
一元标签损失函数反应了图像一致性损失,它与图像一致性成反比。一元损失函数的定义各不相同。假如取值范围在[-1,1]的NCC作为图像一致性函数,一元损失可以定义为如下所示的线性截断损失函数:

式中:τu为截断阈值。任意的鲁棒函数如:huber或cauchy损失函数也可以作为一元损失函数。

*** Pairwise Interaction Potentials ***
成对损失项
成对损失项强制使用空间正则化并与相邻像素的深度差异量成正比,以便使相邻像素具有相似的深度值。成对损失函数的定义也会有所不同,但下面给出一个简单的实现,作为截断线性损失函数,以避免惩罚深度不连续:

*** Optimization ***

式3.2虽然是一个NP问题但是也存在多种近似解,尤其是当pairwise项满足下式时[122]。

对于次模函数,最受欢迎的技术之一被称为alpha扩展[122,45,44],它反复解决最大流量最小割算法以改进标签类别。
幸运的是,子模条件适用于许多标准成对项。更具体地说,作为距离度量Ψ(α,α)应为0,因为两个标签是相同的。剩下的条件为三角不等式:

平滑先验通常被定义为距离度量,并且满足上式的三角不等式^2。示例中的度量是线性的、截断线性或Cauchy(柯西)损失函数。但是,二次或Huber损失函数不是子模函数,因为二次函数不服从三角不等式。 请注意,与成对损失不同,unary potential函数没有限制,可以任意设定。MRF可以用来解决许多其他计算机视觉问题,有关MRF的更多细节将会在接下来的章节详细描述[114,179]。

[2]:子模块化优化是机器学习社区中的一个热门研究课题,其中子模块描述了一系列函数的数学性质。但是在计算机视觉中,通常使用子模块来描述多标记目标函数组合优化问题。 它们在数学上是等价的,但是以非常不同的方式来处理。

3.1.4 Multiple Hypothesis MRF Depthmaps

上一节提到Campbell,Vogiatzis,Hernández和Cipolla扩展标准MRF用来改善结果[48]。而不是对于整个图像不假思索的使用离散的深度值作为可能的标签集,他们的算法从每个像素的图像一致性曲线中提取局部最大值,然后使用MRF公式为每个像素分配一个这样的局部最大值的深度。因此不同的像素具有不同的标签集。他们还使用“unknown(未知)”标签表示某些情况下无法正确估计深度值的情况。在这种情况下,他们承认这个像素点的深度值是未知的,因此不应对表面提供任何数值。这意味着返回的值都是准确的深度,该估计值具有高度的确定性。
该过程包括两个阶段:1)深度标签的提取;2)MRF优化用来分配赋值提取的深度标签。我们现在讨论算法的细节。

Depth Label Extraction

第一阶段是获取像素p在参考图像Iref中深度值的假设集。 在计算Iref和相邻图像的图像一致性曲线后,深度范围内的曲线图像,保留从所有曲线中得分最高的K个曲线的峰值{di(p)|i∈[1,K]},图像一致性函数采用NCC算法。 如前所述,该算法的另一个关键特征是包含未知状态U,当没有足够的选择证据时。 因此对于每个像素,它们形成深度标签集{{di(p)},U}。

MRF Optimization

深度标签分配被当做MRF优化问题,其中每个像素有最多(K + 1)个标签。 如果在深度标签提取阶段找到的峰数不足,标签数K则更少.对应于图像一致性函数中的峰值并相关深度di(p)和得分C(p,di(p))。 最终的状态是如前所述的未知状态U.
一元损失函数很简单。 我们希望对较低的匹配值的局部最大值增加惩罚项,因为它们更可能导致不正确的匹配。 他们采用指数函数的反函数将此分数映射到正损失函数[190], 而常量惩罚项ΦU被强制用于未知状态像素,以避免给具有较差的图像一致性并且没有相邻pairwise项的像素分配深度值.

pairwise项强制使用进行空间正则化。有两个标签类型(深度值和Unkonwn状态)和成对损失在以下4(= 2×2)种情况下定义:

第一种情况,两个标签都有深度值,即损失函数只需计算(3.6)中的差异量。需要注意的是差异量通过深度值的平均值进行归一化,以使其与缩放相关性降低。第二和第三种情况是其中之一标签是Unknown状态,使用常量惩罚项是为了防止频繁切换深度标签和未知状态。最后一种情况是两个标签都是未知状态,为了保持空间一致性惩罚项被设置为0。
遗憾的是pairwise cost在这个公式中并不是子模块,因为每个像素的深度标签是独立提取的,并且第i个标签的含义是不同的。例如,Ψ(di(p),di(q))在标准MRF公式(3.6)中为0,因为di(p)和di(q)是像素无关的并且对应于相同的深度值。但是,在公式中事实并非如此,因此alpha扩展不适用.但是message passing(消息传递)算法,如循环信念传播(LBP)[204]和tree-reweighted message passing(TRW)[194],这是MRF的其他流行的优化技术,特别是TRW已成功应用于解决许多计算机视觉问题包括深度图重建[123,179],并用于工作中。

图3.8说明了图像一致性曲线和局部最大值的位置边界。请注意,遮挡边界处像素分配为未知标签(从顶部开始的第六个像素),其中为了分配正确的深度标签强制执行空间正则化,即使曲线的全局最大值对应于错误的深度(从上数第四个像素)。图3.9列出了更多的实验结果,其中包括重建过程中的中间结果用于评估。如图所示,单个深度图在Unknown(未知状态)标签和在ref参考图像中不可见的部分是一个空洞。然而,仅用高置信度区域的结果用于重建是很重要的,可以在融合步骤中以最小化噪声的存在。图3.9说明了该模型仅在两个有重叠的深度图的中变得接近完整。

3.1.5 More Depthmap Reconstruction Algorithms

以上内容除了前面几节,已经提出了许多深度图重建算法。 本部分介绍了一些更重要的算法和技术文献

Real-Time Plane Sweeping Depthmap Reconstruction

深度图重建的计算量不是廉价的操作,图像一致性函数需要在图像的每个像素和每个假设深度的上进行评估。然而,Gallup, Frahm, Mordohai, Yang, and Pollefeys证明通过聪明地使用GPU可以实现实时[76]。该算法被称为“Plane Sweeping Stereo”,因为它扫描了一系列场景中的平行平面,通过平面将图像投影到平面上单应性,然后评估每个平面上的图像一致性。
每个像素的深度值由“赢者通吃”策略选择,算法中有两个关键特征。

首先,在算法方面,如图3.10的第二行所示,它沿多个方向扫描,这些方向是从场景中提取的,使扫描方向沿着将要重建的场景结构。为了评估照片图像的一致性,大多数算法假设表面相对于ref图像是互相平行的。相当于沿单个固定方向扫描平面。如图3.10的第一行所示,当场景表面不沿着平面方向,不同图像中的相关窗口在平面上不匹配。另一方面,当场景表面在平行的平面时,完全相同的3D表面区域投影到相关窗口,产生准确的照片一致性评估。每个扫描方向产生一个深度图,多个深度图合并产生最终结果(更多细节参见文章[76])。该策略对于通常存在少数主导(例如,曼哈顿)方向的城市场景特别有效,稀疏的3D点云可以从SfM系统重建中获取。
第二个关键区别是高效的GPU实现图像重投影和照片一致性评估,实现实时表现。更具体地,将图像纹理重新投影到扫描平面上遵循平面单应性,这是标准渲染过程并且可以在GPU上有效地执行。后收集重新投影的纹理图像,照片一致性评估也可以在每个像素的GPU上执行。照片一致性功能在原始论文中使用的是增益校正的平方差的和(SSD)。系统在视频序列上进行了演示相同的相机在大致恒定的照明条件下每个序列,这是SSD仍然有效的原因之一使用更昂贵的功能,如NCC并不重要。

采用2.4GHzAMD双核处理器和NVidia GeForce 8800系列GPU以每秒30帧的速度处理512×384视频流。每个深度图计算使用7个图像和48个扫描平面,这仅需要24毫秒。在重建每帧深度图之后,系统具有将所有深度图合并到网格模型中。具体细节见他们的论文[76],接下来我们在3.3节中将会介绍流行的融合技术。图3.11显示了以上算法对几个街道重建的结果。最大的数据集包括170000帧,
该系统通过简单的计算产生了近300亿(≈512×384×170,000)个3D点
,计算忽略高冗余和漏洞重建,其规模远远大于当时出版的对应(相关)方法(2007年)。

Second Order Smoothness

MRF成功用于各种深度图重建算法以及许多其他计算机视觉任务都可以离散成相对较少数量的标签。典型的平滑度先验作用于一对像素,并试图使两个像素的深度差异最小化。 在深度图重建框架中,该先验倾向于前表面平行的平面,也就是说所有的表面有相同的深度值.然而在现实场景中,大多数表面与ref图像并不平行,当假设不成立的时候,先验知识可能会导致重建误差见图3.12.

Woodford, Torr, Reid, and Fitzgibbon 提出了一个立体算法,仍然采用MRF方法,但引入了在三个团(即三个像素)的二阶平滑先验,强制执行分段平面表面 [196]。更具体地说,给定三个相邻的像素 (p, q, r) 惩罚项 [dp + dr - 2dq] 作为平滑损失函数,它是一个二阶导数的有限近似,
当第一阶导数是常量时损失函数为0,即当表面是分段平面。triple cliques的引入使优化变得复杂(至少成本函数不是子函数)需要更复杂的优化算法需要来解决该问题。优化算法的详细信息参考他们的论文[196]
二阶平滑先验的效果和真实情况如图3.12所示。 在顶部合成示例中,大多数结构是分段平面,并且通过标准方法重建(即1阶先验)效果不理想,产生了分段的平行表面。 他们的算法成功地按预期重建了大多数分段平面。 底部例子中大多数真实结构是弯曲的而不是分段平面。 尽管如此,他们的重建结果要多得多比标准方法准确,因为分段平面平滑先验更灵活,更紧密地贴合弯曲表面与平行光滑先验相比。 标准方法在许多地方都存在阶梯状外壳伪影。

原文地址:https://www.cnblogs.com/baozhilin/p/11415733.html

时间: 2024-10-10 18:14:47

[译]Multi-View Stereo: A Tutorial(3)的相关文章

[译]Multi-View Stereo: A Tutorial(1)

摘要: 该教程是MVS领域专注于实用算法的实践手册,MVS算法只依赖于图像,基于一些合理的假设(比如?)重建出真实精确的3d模型. 最重要的是场景固定.该教程将mvs问题转化成图像/几何约束优化问题.详细来说主要在两方面: 1.鲁棒实现图像一致性检测;2.有效的优化算法. 主要讲了这两因素在应用程序和工业中如何应用.本教程还描述了高级方法涉及到领域专业知识如:结构优化,以及接下来的挑战和未来的研究方向. 1简介 1.1 图像获取 有序无序 1.2 相机投影模型 如简介所述,为了使重建效果更好,M

[译]Android view 测量布局和绘制的流程

原文链接 创造优秀的用户体验是我们开发者的主要目标之一.为此, 我们首先要了解系统是如何工作的, 这样我们才可以更好的与系统配合, 从它的优点中获益, 规避它的缺陷. 之前关于Android渲染过程的文章 这次我们主要关注Measure/Layout(测量和布局)的阶段, 这些阶段决定了视图的大小和位置, 以便于我们能够绘制它. Step 1: Measure 测量 目标: 确定是图的大小 视图的大小包含其子视图的大小, 且必须符合其父视图的要求 视图的大小由2个方面决定: 测量宽度与测量高度

[摘抄] SFM 和 Visual SLAM

SFM和vSLAM基本讨论的是同一问题,不过SFM是vision方向的叫法,而vSLAM是robotics方向的叫法, vSLAM所谓的mapping,我们vision方向叫structure,vSLAM所谓的location,我们vision方向叫camera pose. 但是从出发点考虑的话,SFM主要是要完成3D reconstuction,而vSLAM主要是要完成localization. 从方法论的角度上考虑的话,传统的SFM是不要求prediction的,但是对于vSLAM而言pre

Enhancing Android UI with Custom Views 通过自定义view来让你的UI更屌!

Enhancing Android UI with Custom Views (通过自定义view来让你的UI更屌) Table of Contents: Custom View View Measurement View Drawing Custom Attributes Custom ViewGroup ViewGroup Measurement Layout ViewGroup Drawing More Custom Attributes There are many great adva

Dynamic Table View Cell Height and Auto Layout(转)

11/23/2014: Updated to be compatible with iOS 7, iOS 8, and Xcode 6.1. If you wanted to create a customized table view complete with dynamic table view cell height in the past, you had to write a lot of sizing code. You had to calculate the height of

Android 中常见控件的介绍和使用

1 TextView文本框 1.1 TextView类的结构 TextView 是用于显示字符串的组件,对于用户来说就是屏幕中一块用于显示文本的区域.TextView类的层次关系如下: java.lang.Object   ? android.view.View   ? android.widget.TextView 直接子类: Button, CheckedTextView, Chronometer, DigitalClock, EditText 间接子类: AutoCompleteTextV

Visual 3D Modeling from Images

Acknowledgments Notations Contents Introduction 3D from images Overview Projective geometry Projective geometry The projective plane Projective 3-space Transformations Conics and quadrics The stratification of 3D geometry Projective stratum Affine st

String,CString,TCHAR,char之间区别和联系

char是类型TCHAR也是!不过他可以通过是否定义了UNICODE宏来判断到底是char还是w_char; TCHAR是一种字符串类型,它让你在以MBCS和UNNICODE来build程序时可以使用同样的代码,不需要使用繁琐的宏定义来包含你的代码,而char代表ASCII的字符 #ifdef UNICODE   typedef wchar_t TCHAR;   #else   typedef char TCHAR;   #endif 所以用MBCS来build时,TCHAR是char,使用UN

Struts2 简介

回顾Struts2的使用过程,网上搜的教程多多少少都会有点问题,重新记录下创建过程,方便查阅. 1.下载Struts2的jar包 下载地址:http://archive.apache.org/dist/struts/binaries/ 我用的是struts-2.3.14-all.zip这个版本 2.创建一个web project项目 下面给出所有文件均创建完成后的工程师图. 3.导入Struts2所需jar包 因为只是示例程序,只需要导入Struts 2支持最小的包就可以了,网上很多教程中添加的