BFM使用 - 获取平均脸模型的68个特征点坐标
2024-08-26 14:22:52
使用版本: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位特征点坐标了。
最新文章
- IOS Core Animation Advanced Techniques的学习笔记(二)
- android开发--sqlite数据库
- C++ 之 策略模式
- Windows 批处理(bat)语法大全
- win平台,apache通过web访问svn
- Spring中加载ApplicationContext.xml文件的方式
- jquery.cookie.js 用法
- poj 3320 技巧/尺取法 map标记
- javascript笔记——前端实现分页和查询
- Zend Framework 入门(4)—页面布局
- 采集网页数据---Using Java
- 全文搜索-介绍-elasticsearch-definitive-guide翻译
- window7下statsvn统计代码量
- libuv 初窥--转
- 每天收获一点点------Hadoop之初始MapReduce
- 谨慎能捕千秋蝉(一)——XSS
- JavaScript对象类型判断注意点
- tesseract库
- Building QGIS from source - step by step (开发文档翻译1)
- Using MongoDB with Web API and ASP.NET Core
热门文章
- C# mysql set和enum属性字段的读取和添加
- 解决xp越来越慢的办法(其中有些自动备份的功能)
- windows下进程间通信的(13种方法)
- LINUX下QT FOR ARM开发环境搭建过程 (使用qt-x11-opensource-src-4.5.2.tar.gz进行编译)
- 解释一下,知乎上关于C语言奇技淫巧最火的回答。
- 一道经典的js面试题
- JVM(六):探究类加载过程-下
- 重定向Redirect 的知识
- PWN菜鸡入门之栈溢出 (2)—— ret2libc与动态链接库的关系
- 曹工说Tomcat2:自己撸一个简易Tomcat Digester