VividFace / BFM /matlab /coef2object.m
deepcs233's picture
Upload folder using huggingface_hub
c4bb28a verified
function obj = coef2object(coef, mu, pc, ev, MM, MB)
%COEF2OBJECT produces a shape or a texture from MM coefficient.
% OBJ = COEF2OBJECT(COEF, MU, PC, EV) produce a shape or a texture OBJ from coefficients
% COEF given a model. The model can be a shape or texture model. It is given as three
% matrices. The vector MU stores the mean, the matrix PC, the principal components and
% EV the standard deviation of each principal components. The coefficients COEF must be
% provided in units of standard deviation, i.e. the range of values is the same for all
% coefficients and is comparable to 1.
%
% OBJ = COEF2OBJECT(COEF, MU, PC, EV, MM, MB) produce a shape or texture from
% coefficients of 4 segments. The different segments are blended together to yield a
% single shape or texture. A segment is a portion of a face. In the MM four segments are
% used: the nose, the eyes, the mouth and the rest. The coefficient of a segment is
% given as a colum vector of COEF. Hence, COEF is a matrix with four columns.
%
% The number or rows of COEF must be equal to the number of columns of PC and to the
% number of elements of EV. The number of rows of MU must be equal to the number of rows
% of PC.
%
%Example:
% alpha = randn(99, 4); % Random shape coefficients of 4 segments
% beta = randn(99, 4); % Random texture coefficients of 4 segments
% shape = coef2object( alpha, shapeMU, shapePC, shapeEV, MM, MB );
% tex = coef2object( beta, texMU, texPC, texEV, MM, MB );
%
%See also OBJECT2COEF SCRIPT_GEN_RANDOM SCRIPT_RENDER_FITTING
%% AUTHOR : Sami Romdhani
%% EMAIL : Sami.Romdhani@unibas.ch
%% URL : http://informatik.unibas.ch/personen/romdhani_sami/
%% CREATION : 18-Jul-2008 11:08:33 $
%% DEVELOPED : 7.6.0.324 (R2008a)
%% FILENAME : coef2object.m
%------------- BEGIN CODE --------------
% Arguments checking
if nargin ~= 4 && nargin ~= 6
error('Inappropriate number of arguments')
end
if nargout ~= 1
error('One output argument required')
end
n_seg = size(coef, 2);
if nargin == 4 && n_seg > 1
error('Blending reconstruction requested, but blending parameters missing')
end
n_dim = size(coef, 1);
if n_dim > size(pc, 2)
error('Too many coefficients.')
end
% Reconstruction
obj = mu*ones([1 n_seg]) + pc(:,1:n_dim) * (coef .* (ev(1:n_dim)*ones([1 n_seg])) );
if nargin == 4, return; end
% Blending (optional)
n_ver = size(obj,1)/3;
all_vertices = zeros(n_seg*n_ver, 3);
k=0;
for i=1:n_seg
all_vertices(k+1:k+n_ver, :) = reshape(obj(:,i), 3, n_ver)';
k = k+n_ver;
end
clear obj k
obj = (MM \ (MB*all_vertices) )';
obj = obj(:);
%------------- END OF CODE --------------