3D纹理重建

三维重建包括两个方面,一个是几何重建,一个是纹理重建。
纹理重构主要包含两个问题:一是将纹理图像与几何模型进行配准;二是将纹理图像无缝地粘贴到三维模型表面上,先来直观感受一下,左侧图像为三角网格模型,右侧为带有纹理的3D模型
3D纹理重建_第1张图片 3D纹理重建_第2张图片
纹理重建的输入项包括:
二维纹理图像、图像对应的相机标定参数、无纹理的3D模型(一般为三角网格模型)
注:相机的标定参数包括R, T, K
R为旋转矩阵,T为平移向量
K = { f 0 cx
0 f cy
0 0 1 }
cx = img.cols
cy = img.rows
f : 焦距

纹理重建的输出项为:
带有纹理的3D模型

纹理重建的主要步骤如下:
1. load_view() read_obj_model()
读取二维纹理图像及其对应的相机模型几何参数,读取带有三角网格的3D模型

2. labeling(model, adj_face_list, views, labels)
calculate_data_cost(model, views)

对每个面片对应视角赋标签,在标签赋值的过程中主要用到BVH(碰撞检测)和MRF(视角选择马尔科夫能量场)两个处理算法
其中BVH检测方法:相机中心(某一视角下)与三角面片的三个顶点连线,如果连线与其他三角面片相交,则说明在这一视角下,被检测的三角面片是不可见的,反之,可见。
MRF的作用为找到能量函数最小时对应的标签配置

3. find_coonected_area(adj_list, labels)
寻找相同标签的表面

4. vertices_prepare(views, src_model, labels)
对列表中的每个标签的相邻顶点进行排序,初始化顶点信息,使用平均的权重的颜色信息作为顶点信息

5. calculate_bboxes(src_model)
计算模型分割块数(3D模型被分割为若干块,以便后续进行纹理贴图),通过bboxes对patch进行排序

6. generate_texcoord(src_model, rst_model)
通过src_model中的信息,以及上述过程中的信息求得uv坐标

7. generate_texture(rst_model, views, texture_num, texture_imgs)
颜色调整,产生 生成纹理图,通过uv坐标将纹理映射到3D模型上

注:
在做完纹理映射后,在patch间会出现缝隙或者纹理错位现象,因为映射过程会有一定的误差出现,如下图所示,左侧图像可以明显看出两块patch间有一定程度的错位。另外,由于在采集图像的过程中由于光照等原因,最终得到的带纹理的3D模型的整体纹理效果会差一些。所以,为了得到更好的纹理效果,在上述处理之后,可以对模型进行全局颜色调整泊松图像编辑两个步骤,处理后的交过如下右图所示。

3D纹理重建_第3张图片 3D纹理重建_第4张图片

具体过程及原理参考文章:“Let There Be Color! Large-Scale Texturing of 3D Reconstructions
C++代码链接:https://github.com/tyluann/3DTexture

你可能感兴趣的:(三维重建)