Skip to content

Instantly share code, notes, and snippets.

@bobye
Last active December 11, 2015 03:18
Show Gist options
  • Save bobye/4536482 to your computer and use it in GitHub Desktop.
Save bobye/4536482 to your computer and use it in GitHub Desktop.
compute blend weights offline
%% load std_expr captured data
clear;
dof=24;
header_file = fopen('start_frame.txt');%set header information file
i = 0;
while (1)
[name, count]= fscanf(header_file, '%s',1);
if (count ==0)
break;
end
i=i+1;
std_expr(i).name = name;
std_expr(i).start = fscanf(header_file, '%d',1);
std_expr(i).end = fscanf(header_file,'%d',1);
end
size_of_expr = i; i=1;
while (strcmp(std_expr(i).name, 'base') == 0) i=i+1; end
if (i>size_of_expr)
print 'Error: No base expression';
else
base_id = i; %fix to be the first
end
for i=1:size_of_expr
name = sprintf('%s.dat',std_expr(i).name);
tmp = load(name); tmp = tmp(std_expr(i).start+1:std_expr(i).end, 13:36);
std_expr(i).frames = tmp;
std_expr(i).avg = mean(tmp);
end
%% process data (default)
metric = eye(dof);
basis = zeros(size_of_expr-1, dof);
for i=2:size_of_expr
basis(i-1,:) = std_expr(i).avg - std_expr(base_id).avg;
end
% compute intra-variance
intra_var = zeros(dof);
inter_var = zeros(dof);
for i=1:size_of_expr
F = std_expr(i).frames;
F = F - repmat(std_expr(i).avg, size(F,1),1);
intra_var = intra_var + F'*F /size(F,1);
end
intra_var = intra_var / size_of_expr;
for i=2:size_of_expr
inter_var = inter_var + basis(i-1,:)' * basis(i-1,:);
end
for i=2:size_of_expr
for j=i+1:size_of_expr
inter_var = inter_var + (basis(i-1,:)' - basis(j-1,:)')*(basis(i-1,:) - basis(j-1,:));
end
end
inter_var = inter_var / ((size_of_expr)*(size_of_expr+1)/2);
[V, D] = eig(inter_var - intra_var, intra_var);
[D, IDX] = sort(diag(D),'descend');
V = V(:,IDX); D=sqrt(sqrt(D/D(1)));
D(D<0) = 0; %D(D>0) = 1;
V= V*diag(D);
metric = metric + V*V';
%% compute weights for motion data(optimizer)
tmp = load('tracking.dat');
motion = tmp(:,13:36);
total_frames = size(motion,1);
motion = motion - repmat(std_expr(base_id).avg, total_frames,1);
xopt = zeros(total_frames,size_of_expr-1);
A = eye(size_of_expr-1);
b = ones(size_of_expr-1,1);
xmin = zeros(size_of_expr-1,1);
H = basis*metric*basis'; H = (H + H')/2;
f0 = -basis*metric;
for i=1:total_frames
f = f0*motion(i,:)';
xopt(i,:)= qpdantz(H,f,A,b,xmin);
end
dlmwrite('tracking_weights.dat',xopt,'delimiter',' ');%write weights
dlmwrite('tracking_weights.dat',[num2str(total_frames) 13 10 fileread('tracking_weights.dat')],'delimiter','');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment