3D人脸识别——点云转化为可训练的图片

1.场景介绍

     3D人脸点云不容易直接训练,需要将其转化为二维图片。大部分论文是这样做的:首先求出每个点所在平面的法向量,发向量与水平面和竖直平面的夹角组成两个通道,深度图是一个通道。然后,将这三个通道归一到[0~255],形成我们人眼可见的图片。最后,就可以像训练图片一样训练人脸识别了。

2. 原始的点云

     将点云MashLab中打开,如下图所示:

        如果你没有安装MeshLab,也可用代码打开,更加直观的查看点云,代码如下:

#coding:UTF-8
import os
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

def ply_reader(ply_file):
    with open(ply_file, "r") as f:
        lines = f.readlines()
        lines = lines[12:-3]
    x = []
    y = []
    z = []
    for line in lines:
        parts = line.split(" ")
        x.append(float(parts[0]))
        y.append(float(parts[1]))
        z.append(float(parts[2]))
    return x, y, z

def obj_reader(obj_file):
    alpha, beta, theta, x, y, z = [], [], [], [], [], []
    with open(obj_file, "r") as f:
        lines = f.readlines()
        lines = [i for i in lines if i[0]=="v"]
    for line in lines:
        if line[:2] == "vn":
            parts = line.rstrip("\n").split(" ")
            alpha.append(float(parts[1]))
            beta.append(float(parts[2]))
            theta.append(float(parts[3]))
        else:
            parts = line.rstrip("\n").split(" ")
            x.append(float(parts[1]))
            y.append(float(parts[2]))
            z.append(float(parts[3]))
    return x, y, z, alpha, beta, theta

def points_show(x, y, z):
    fig = plt.figure()
    ax = Axes3D(fig)
    ax.set_xlabel('X label',color='r')
    ax.set_ylabel('Y label',color='r')
    ax.set_zlabel('Z label')
    ax.scatter(x,y,z,c='b',marker='.',s=2,linewidth=0,alpha=1,cmap='spectral')
    plt.show()


if __name__ == "__main__":
    x, y, z, alpha, beta, theta = obj_reader("60.obj")
    points_show(x,y,z)

          打开的点云如下:

3. 点云法向量三个分和深度分量四个通道的图片如图所示

     四张图片从左到右分别是法向量与三维空间三个平面夹角的余弦值,最后一张图是深度值。

     将第一张图、第三张图、第四张图三个通道叠加起来,形成训练的彩色图,如下图所示:

注:将人脸点云转化为上述图片,就可以进行3D人脸识别了。

       如需技术交流,请留言,或添加作者微信(下面二维码)。

       

猜你喜欢

转载自blog.csdn.net/Guo_Python/article/details/115012022