【作业】Texture Mapping for 3D Reconstruction with RGB-D Sensor

文章内容概述

Abstract

在三维重建中,获取真实的细节纹理信息是非常重要的,但是由于RGB-D传感器噪声导致的几何误差,使得rgb的信息UN不能很好的和重建模型匹配。在本文中,作者提出一种全局到局部的校正策略来获得更加准确的纹理映射结果。该算法首先自适应地为三维模型的每个面选择一幅最优图像,可以有效地去除多幅图像混合产生的模糊和鬼影。然后作者采用一个非刚性的全局到局部校正步骤来减少纹理之间的缝合效果,该方法可以有效地补偿由相机姿态漂移和几何误差引起的纹理和几何对准误差,作者在一系列复杂场景中评估了该算法,并演示了其在生成三维模型无缝高保真纹理方面的有效性。

1. Introduction

作者指出,尽管目前大场景和小场景的3D重建在RGB-D传感器的出现后都能做大不错的效果,但是在细节上还是不尽人意。作者指出为什么纹理映射技术如此落后于3D建模的几点原因:

  1. 由于深度数据的噪声,重建的三维模型往往伴随着几何误差和畸变
  2. 在相机轨迹估计中,姿态残差会逐渐累积,导致相机漂移
  3. 捕获的深度帧和颜色帧之间的时间戳不是完全同步的
  4. RGB-D传感器通常分辨率较低,彩色图像也容易受到光和运动条件的影响
    上述的几个问题都会导致图像到几何模型之间的不匹配。

虽然射影映射方法可以减少多幅图像混合造成的模糊和重影伪影,但由于几何配准误差和相机轨迹漂移,不同视图的边界不可避免地会出现纹理溢出。
本文作者提出的新型的纹理映射方法实现全局到局部的非刚性的校正优化。首先,作者对每一个优化的人脸都选择一张最优的图像,以避免多张图像混合时造成的影响。在全局优化步骤,作者采用统一的色彩一致性几何一致性算法来从不同的视角校正每个纹理块的相机姿态。接着在局部优化步骤,作者找到了一个额外的转换块的边界顶点细化由几何误差引起的纹理坐标漂移。最后采用纹理地图集映射纹理到所需的三维模型。

2. Related Work

纹理映射在3D模型重建中是非常重要的一部分,作者首先介绍一些目前常用的方法:

2.1 Blending-based methods

即将多张图像混合到纹理映射中,并采用不同的权重加权。目前的RGB-D重建策略主要依赖截尾带符号距离函数(TSDF)表示。也就是他们需要添加一个额外的颜色体积网格,除了TSDF体积网格之外,通过对多个图像进行加权平均来计算每个顶点的颜色。但是,这使得这种方法对计算噪声很敏感;如果恢复的相机姿态或3D几何图形稍微不准确,模糊和重影就很容易出现。此外,模型细分的过程和不同视角下模型大小的变化也会影响其性能。

2.2 Projection-based methods

另一种机制是投影纹理映射,它将每个面或顶点与一个合适的图像关联起来。Lempitsky等使用两两马尔可夫随机场为每张脸选择最优图像,受此启发,Allene等人和Gal等引入了额外的度量来改进数据项和平滑项,以选择更合适的视图,然而,这些方法面临着一个具有挑战性的问题,即如何减轻相邻人脸纹理之间的视觉接缝。为了克服这一问题,他们必须通过分别使用多波段混和来增加一个后处理。Waechter等提出了一种全局色彩调整算法来减少由于视图投影造成的视觉损伤,虽然这些方法可以有效地减少多幅图像混合所产生的模糊和重影现象,但由于几何配准误差和相机轨迹漂移,在不同视点的边界上会不可避免地产生纹理溢出。

2.3 Warping-based methods

和上述两种方法不一样的是,该种方法对几何误差和相机漂移引起的不对准问题有更强的抵抗能力。Eisemann等人引入了一种估计投影纹理图像间光流的局部纹理扭曲方法。Aganj等人对不同的图像采用不同的变形来拟合恢复的网格。采用薄板样条近似方法对不同视角下的特征点进行匹配,计算位移场。此外,Zhou和Koltun设计了一个纹理映射框架,通过局部图像扭曲来矫正相机姿态和几何误差。但是这种方法需要对网格模型进行细分,这会大大增加数据量,限制了其应用范围。此外,由于仍采用加权平均混合策略,这些方法也存在模糊现象。最近,Bi等人使用基于块的合成方法为每个人脸生成新的目标纹理图像,以补偿摄像机漂移和重建误差,但包含动态阴影的场景将是该方法的挑战。

3 Overview

这项工作的目标是将纹理图像映射到由日用深度摄像机获得的三维模型上。输入为包含深度帧和相应颜色帧的RGB-D序列或视频,输出为带有高保真纹理的3D模型。为了做到这个任务并克服上述提到的问题,作者的工作主要包括四个部分,如下图所示。
在这里插入图片描述

  1. 输入
    输入的是通过Kinect V1 收集到的RGB-D的序列或者视频,要获得更详细的颜色信息,还建议添加一个附加的高清摄像头在Kinect上获得高分辨率的纹理图像。但是为了便于比较,我们在实验中仍然采用Kinect V1的低分辨率彩色图像作为输入。
  2. 处理
    根据输入的深度序列重建网格模型作为初始模型 M 0 M_0 M0进行纹理映射,从原始color序列中提取帧子集作为纹理候选。为了提高质量和降低计算复杂度,作者采用[28]来重建3D模型,而不是KinectFusion。通过加权图像清晰度、抖动、模糊和视口覆盖的元素来选择纹理候选图像。这一步产生一个初始模型M0和一组对应选择的彩色图像子序列 { C i } \left\{\mathbf{C}_i\right\} { Ci}和深度图像子序列 { D i } \left\{\mathbf{D}_i\right\} { Di}的相机姿态 { T i 0 } \left\{\mathbf{T}_{i}^{0}\right\} { Ti0}
  3. 优化
    为了构造高保真纹理,作者结合了上述几种目前的算法的优点。为了避免多幅图像混合造成的模糊,作者为模型的每一张人脸都选择了一幅最优纹理图像。因此,作者将候选图像作为一个标签,将选择问题转化为一个多标签的马尔可夫域,并结合相机姿态与法线图的角度、投影面积和模型面到相机平面的距离。然而,因为 T 0 \mathbf{T}^{0} T0 M 0 M_0 M0不是绝对准确的,不同标签的相邻面通常不能完全缝合。为了解决这一问题,我们采用了全局到局部的优化策略。为了实现全局优化,作者根据纹理块之间的颜色一致性和几何一致性来调整每个纹理块的相机位姿。在局部优化阶段,作者导入额外的变换来细化不同块边界上的纹理坐标,实现无缝拼接纹理。
  4. Texture Atlases
    最后,作者利用纹理地图集将所需的纹理映射到3D模型上。在优化的相机姿态下,将每个人脸投影到相关的纹理图像上,得到投影区域。利用每个投影区域建立纹理地图集,同时记录每个三角形面顶点坐标。然后作者把它们转换成地图集。这样就可以通过纹理坐标直接在地图集中检索每个顶点的纹理,并生成最终的纹理模型。

4. Texture Mapping Method

M 0 M_0 M0表示重构的纹理映射网格模型, { v i } \left\{\mathbf{v}_i\right\} { vi} { f i } \left\{\mathbf{f}_i\right\} { fi}分别为M0的顶点集和面集,每个面代表模型上的一个三角形网格。
T T T是一个4×4的变换矩阵,它将 M 0 M_0 M0的顶点 v i v_i vi从世界坐标转换为局部摄像机坐标,定义为:
T = [ R t 0 1 ] \mathbf{T}=\left[\begin{array}{ll} \mathbf{R} & \mathbf{t} \\ \mathbf{0} & 1 \end{array}\right] T=[R0t1]
这里的 R \mathbf{R} R表示 3 × 3 3\times 3 3×3的旋转矩阵, t t t表示的是 3 × 1 3\times 1 3×1的平移向量。作者也指定从三维顶点 v = [ x , y , z ] T \mathbf{v}=[x, y, z]^{T} v=[x,y,z]T到二维图像的映射记做 π \pi π,因此图像上的点可以通过以下的矩阵转通过三维顶点转变得到:
u ( u , v ) ) = Π ( K v ) = ( x f x z + c x , y f y z + c y ) T \mathbf{u}(u, v))=\Pi(\mathbf{K} \mathbf{v})=\left(\frac{x f_{x}}{z}+c_{x}, \frac{y f_{y}}{z}+c_{y}\right)^{T} u(u,v))=Π(Kv)=(zxfx+cx,zyfy+cy)T
这里的 K K K是摄像机的内在矩阵, f x , f y f_x, f_y fx,fy为焦距, c x , c y c_x, c_y cx,c

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Projective texture mapping in Unity Shader is a technique used to project a texture onto an object in a way that simulates the effect of a slide projector. It can be used to create various effects like projecting a spotlight texture onto a surface, projecting a decal onto a curved surface, or creating a shadow map for an object. To implement projective texture mapping in Unity Shader, you need to use a combination of vertex and fragment shaders. The vertex shader calculates the projective transformation matrix, which is used to transform the texture coordinates in the fragment shader. The fragment shader samples the texture and applies it to the object's surface. Here's a simple example of a vertex shader that calculates the projective transformation matrix: ``` Shader "Custom/ProjectiveTextureMapping" { Properties { _MainTex ("Texture", 2D) = "white" {} _Projector ("Projector", 3D) = "" {} } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag uniform sampler2D _MainTex; uniform float4x4 unity_Projector; float4x4 unity_ObjectToWorld; struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = mul(unity_Projector, v.vertex).xy; return o; } fixed4 frag (v2f i) : SV_Target { return tex2D(_MainTex, i.uv); } ENDCG } } } ``` In this example, the `_MainTex` property is the texture to be projected, and the `_Projector` property is the object that will project the texture. The `unity_Projector` variable is a matrix that transforms the texture coordinates from object space to clip space. The `vert` function calculates the transformed texture coordinates and passes them to the fragment shader in the `v2f` struct. The fragment shader simply samples the texture using the transformed texture coordinates and returns the color. You can use this shader by assigning it to a material and setting the `_MainTex` and `_Projector` properties to appropriate textures and objects, respectively.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值