(个人)基于深度学习的中国传统特色图像的风格迁移创新实训第九周(2)
先准备个标准形状做参考,比如从论文里找这样一张图,用ginput按顺序选68个点(68个点的定义见CMU那帮人的论文,文献[2],也可以用画图软件事先标好你要的点,比如下图的蓝点,这样的好处是可以保证使用ginput(68)一次成功):
imshow('meanface.jpg');
sh = ginput(68);
这样这些点的X,Y坐标就放在sh的两列里。把它作为一个标准形状,存在一个文本文件里。
2.程序开始,先要load标准形状。然后通过对话框选取一个图像文件,并显示
[filename, pathname] = uigetfile([pathname,'*.bmp;*.jpg;*.png'], 'Pick an image');
Aim = imread([pathname,filename]);
imshow(Aim,[]);
检查输入图像是否有对应的lmk文件,即是否做过手工标定了:如果没有进入第3步;如果有lmk,则转入第4步,从lmk文件读取形状数据。
3.按顺序选取左眼,右眼,嘴中心3个点,如图。
根据这3点和标准图上对应点计算仿射变换,把标准形状[Xo,Yo]投影到图像中。
4.如果对应的lmk文件已经存在,则读入lmk,把形状[Xo,Yo]铺在图像上。
5.根据上面的输入信息,粗略计算一个人脸区域box,并且放大显示
im=imcrop(Aim,box);
imshow(im,[]);
下面就可以编辑这个形状了
5.1 每次用ginput(1)选择要移动的点,
[xc,yc,button]=ginput(1);
%最近点的序号存在ind里
[val,ind]=min((xc-Xo).^2 + (yc-Yo).^2);
5.2 再用ginput(1)选择要移动的位置,替换旧的值
[xc,yc,button] = ginput(1);
Xo(ind)=xc;
Yo(ind)=yc;
重复这两个步骤,直到满意为止。
6. 保存形状文件(.lmk)
fid = fopen( [pathname,landmarkfile], 'w');
fprintf(fid,'%6.2f %6.2frn', [X,Y]');
fclose(fid);
另外利用delaunay函数事先计算平均形状的三角网格(mesh):
mtri=delaunay(meanshape68(:,1),meanshape68(:,2));
mtri的每行存储的是3角形的3个顶点序号,我们也可以利用这个三角剖分信息,把网格画在人脸上。