使用版本: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=downloads

使用Matlab导入01_MorphableModel.mat

load('解压目录\01_MorphableModel.mat')



160470=53490*3,即形状(Shape)\(S=(x_1, y_1, z_1, ..., x_n, y_n, z_n)\)

包含内容:

  • segbin:猜是segment binary,用热点法标注属于面部哪一部分。

  • shapeEV:形状方差;
  • shapeMU(160470*1):平均形状;
  • shapePC:形状的主成分;
  • texEV:纹理方差;
  • texMU:平均纹理
  • texPC:纹理的主成分;

新建一个Matlab脚本,输入如下代码:

shape = reshape(shapeMU, 3, 53490)
shape = shape.'
x = shape(:, 1)
y = shape(:, 2)
z = shape(:, 3)
scatter3(x,y,z, 1, 'filled');

该代码将原本一行的形状向量转换为n*3的矩阵,然后将其在三维坐标系下画出来,我们可以看到显示如图人脸。

官方提供的landmark对应关系格式如下(Farkas_face05.fp):

# 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矩阵当中:

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文件,并进行打印:

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

显示效果图如下

因为我们最终想通过与dlib提供的68个点进行拟合,因此不能使用这种方法得到的特征点。

这边找到了Github上有人提供的68个特征点在BFM上的对应关系:https://github.com/anilbas/BFMLandmarks

我们将其中的Landmarks68_BFM.anl文件内的68个下标导入Matlab然后更新代码:

% 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位特征点坐标了。

BFM使用 - 获取平均脸模型的68个特征点坐标的更多相关文章

  1. Django通过字段获取关联模型

    #根据字段获取关联表 filter_field_obj=self.model._meta.get_field(filter_field) print('filter_field_obj:',filte ...

  2. VTK中获取STL模型点的坐标以及对其进行变换

    VTK是一个基于面向对象的开源三维绘图软件包,和其它的的三维绘图引擎如OSG.OGRE不同之处在于,VTK可视化对象主要是各种数据,更加注重对数据分析处理后的可视化,可视化的内容是人们无法直接感受到的 ...

  3. C#开发BIMFACE系列21 服务端API之获取模型数据6:获取单模型的楼层信息

    系列目录     [已更新最新开发文章,点击查看详细] 一个文件/模型中可能包含多个楼层信息,获取楼层信息对于前端页面的动态展示非常有帮助.本篇介绍获取一个文件/模型中可能包含多个楼层信息的详细方法. ...

  4. JS设置和获取盒模型的宽和高

    JS设置和获取盒模型的宽和高 dom.style.width/height:只能取出内联样式的宽度和高度 dom.currentStyle.width/height:获取即时的计算的样式,但是只有IE ...

  5. JS如何设置和获取盒模型对应的宽和高

    ㈠方式一:通过DOM节点的 style 样式获取  dom.style.width/height  只能获取使用内联样式的元素的宽和高. <!DOCTYPE html> <html ...

  6. Python 3 利用 Dlib 实现人脸 68个 特征点的标定

    0. 引言 利用 Dlib 官方训练好的模型 “shape_predictor_68_face_landmarks.dat” 进行 68 个点标定: 利用 OpenCv 进行图像化处理,在人脸上画出 ...

  7. VS编程,WPF中,获取鼠标相对于当前程序窗口的坐标的一种方法

    原文:VS编程,WPF中,获取鼠标相对于当前程序窗口的坐标的一种方法 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/ ...

  8. 获取鼠标经过位置的X、Y坐标

    利用JavaScript获取鼠标经过位置的X.Y坐标方法. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN& ...

  9. 【死磕 Spring】----- IOC 之 获取验证模型

    原文出自:http://cmsblogs.com 在上篇博客[死磕Spring]----- IOC 之 加载 Bean 中提到,在核心逻辑方法 doLoadBeanDefinitions()中主要是做 ...

随机推荐

  1. SQLSERVER使用密码加密备份文件以防止未经授权还原数据库

    原文:SQLSERVER使用密码加密备份文件以防止未经授权还原数据库 SQLSERVER使用密码加密备份文件以防止未经授权还原数据库 在备份数据库的时候,用户可以为媒体集.备份集或两者指定密码 在ba ...

  2. OWIN 托管服务器问题:StartOptions WebApp.Start TargetInvocationException

    我有一个与OWIN托管的服务器有一个小问题.我试图让它可以访问本地网络,这意味着我不得不添加一些额外的选择: // Start OWIN host StartOptions options = new ...

  3. 向github提交本地项目

    首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下载地址,下载后一路直接安装即可: https://gi ...

  4. uwp开发:数据绑定——值转换器 的简单使用

    原文:uwp开发:数据绑定--值转换器 的简单使用 今天,我在做最近正在开发的“简影”uwp应用时遇到一个问题,其中有个栏目,叫做“画报”,是分组显示一组一组的 图片,每组图片在界面上只显示9个,点击 ...

  5. 静态dll的问题终于搞定了

    导入plugin,构建qapplicationhttps://forum.qt.io/topic/60940/qt-static-dll-x64-using-qapplication-issues/2 ...

  6. Unity 入門 - 延遲解析

    本文大纲: 小引 共享的范例代码 使用 Lazy<T> 使用自动工厂 注入自定义工厂 小引 当我们说「解析某个型别/组件」时,意思通常是呼叫某类别的建构函式,以建立其实例(instance ...

  7. Java 诞生的趣事

    ​ Java 命名的由来 Java是印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名.Java语言中的许多库类名称,多与咖啡有关:如JavaBeans(咖啡豆).NetBeans(网络豆)以及Object ...

  8. 【设计模式】【最后一个】结构型07适配器模式(Adapter Pattern)

    适配器模式(Adapter Pattern) 推荐一个很全面的博客:https://blog.csdn.net/zxt0601/article/details/52848004 定义:将一个类的接口转 ...

  9. 【设计模式】行为型04迭代器模式(Iterator Pattern)

    学习地址:http://www.runoob.com/design-pattern/iterator-pattern.html 迭代器模式,简单来说就是通过迭代的方式对集合进行遍历,在集合的学习中也一 ...

  10. 基于cxf开发的WebService

    Node.jshttps://www.cnblogs.com/goldlong/p/8027997.htmlQQ音乐apihttps://juejin.im/post/5a35228e51882506 ...