使用版本:2009
数听说明网址:https://faces.dmi.unibas.ch/bfm/index.php?nav=1-1-0&id=details
数据下载网址:https://faces.dmi.unibas.ch/bfm/index.php?nav=1-2&id=downloadsphp
使用Matlab导入01_MorphableModel.matpython
load('解压目录\01_MorphableModel.mat')
160470=53490*3,即形状(Shape)\(S=(x_1, y_1, z_1, ..., x_n, y_n, z_n)\)
包含内容:git
新建一个Matlab脚本,输入以下代码:github
shape = reshape(shapeMU, 3, 53490) shape = shape.' x = shape(:, 1) y = shape(:, 2) z = shape(:, 3) scatter3(x,y,z, 1, 'filled');
该代码将本来一行的形状向量转换为n*3的矩阵,而后将其在三维坐标系下画出来,咱们能够看到显示如图人脸。
app
官方提供的landmark对应关系格式以下(Farkas_face05.fp):spa
# Feature Points # Filename: /net/faces/projects/model200/fps/new_farkas/face05_farkas.fp # Format: (vertex_nr) (x y z) (x y) (name) 19963 -88262.2 36394.8 -4947.64 0 0 sa 20205 -71257.4 -20598.4 13258.3 0 0 sba 21629 -77516 30127.9 12058.9 0 0 pra ...
所以咱们经过一个python脚本读取其中的三维点信息并保存到mat矩阵当中:code
import scipy.io as scio file = open("Farkas_face05.fp") landmarks = [] while True: line = file.readline() if not line: break if line[0] < '0' or line[0] > '9': continue args = line.split() coord = [float(args[1]), float(args[2]), float(args[3])] landmarks.append(coord) scio.savemat('landmarks.mat', {'landmarks': landmarks})
随后从Matlab中读取这个mat文件,并进行打印:orm
scatter3(x,y,z,2, 'filled'); hold on; for i = 1:70 scatter3(landmarks(i,1), landmarks(i,2), landmarks(i,3),10, 'r'); end
显示效果图以下
blog
由于咱们最终想经过与dlib提供的68个点进行拟合,所以不能使用这种方法获得的特征点。
这边找到了Github上有人提供的68个特征点在BFM上的对应关系:https://github.com/anilbas/BFMLandmarks
咱们将其中的Landmarks68_BFM.anl文件内的68个下标导入Matlab而后更新代码:ip
% tmp存储了Landmarks68_BFM.anl中的68个下标 scatter3(x,y,z,2, 'filled'); hold on; for i = 1:68 scatter3(x(tmp(i)), y(tmp(i)), z(tmp(i)),10, 'r'); end
显示结果以下:
这即是咱们想要获得的68个点,最后咱们把这68个点的坐标导出到本地:
landmarks = zeros(68,3); for i = 1:68 landmarks(i, :) = [x(tmp(i)), y(tmp(i)), z(tmp(i))]; end save landmarks landmarks
这样咱们就能够在后续的代码中经过导入landmarks.mat来获取标准脸的68位特征点坐标了。