clearall;
%% title
info_=[
'文档的功能: 是实现对图像的标准化' ...
',标准化的方式采用将所有形状对齐的平均形状. \n'...
'文档的创建时间为:2016/11/1/18:37 \n'];
%% content
data = load('pose_train_data.mat','s_traindata','s_testdata');
train_data = data.s_traindata;
test_data = data.s_testdata;
n_train = length(train_data);
n_test = length(test_data);
ref_model_size = 200;
face_size = 100;
disp_xy = 50;
mean_shape0 = calc_meanshape2(train_data);
isShow = true;
%for i=1:n_train
for i=1:1
img = imread(train_data(i).imgPath);
img = rgb2gray(img);
landmark = train_data(i).landmark;
nlandmark = train_data(i).nlandmark;
bbox = train_data(i).bbox;
face_img = img(bbox(2):bbox(2)+bbox(4),bbox(1):bbox(1)+bbox(3));
mean_shape = mean_shape0;
meanxy = mean(landmark,1);%landmark的中心
% 将平均形状扩展到框架内
mean_shape = disp_xy + face_size .* mean_shape;
mean_shapexy = mean(mean_shape,1);%meanshape的中心
% show
%img = 255 * ones(ref_model_size,ref_model_size,3);
%drawshapes(img, disp_xy + face_size * mean_shape);
%from meanshape to landmark,计算相似变换矩阵
trans_mat = fitgeotrans(bsxfun(@minus,landmark,meanxy),bsxfun(@minus,mean_shape,mean_shapexy), 'NonreflectiveSimilarity');
%% 公式:(u,v)=(x,y,1)T
% T=[sc -ss 0
% ss sc 0
% tx ty 1];
%% 将landmark转换到标准框架内
m_landmark = bsxfun(@minus,landmark,meanxy);
warp_landmark = transformPointsForward(trans_mat,m_landmark);
for j = 1:nlandmark
warp_landmark(j,1) = warp_landmark(j,1)+mean_shapexy(1);
warp_landmark(j,2) = warp_landmark(j,2)+mean_shapexy(2);
end
%% 将图像转换到标准框架中
%res_img=zeros(ref_model_size,ref_model_size);
% 原理上 T(3,1)=T(3,2)=0
T = trans_mat.T;
T1 = T;
T1(3,1) = T(3,1)+mean_shapexy(1)-(T(1,1)*meanxy(1)+T(2,1)*meanxy(2));
T1(3,2) = T(3,2)+mean_shapexy(2)-(T(1,2)*meanxy(1)+T(2,2)*meanxy(2));
trans_mat.T = T1;
T2 = zeros(2,3);
T2(1,1) = T(1,1);
T2(1,2) = T(2,1);
T2(2,1) = T(1,2);
T2(2,2) = T(2,2);
T2(1,3) = T(3,1)+mean_shapexy(1)-(T(1,1)*meanxy(1)+T(2,1)*meanxy(2));
T2(2,3) = T(3,2)+mean_shapexy(2)-(T(1,2)*meanxy(1)+T(2,2)*meanxy(2));
wsize = [ref_model_size ref_model_size];
%matlab
tic;
%[size.h size.w]为目标图像的大小. [1 size.w] [1 size.h]为显示的x,y的范围。
RA = imref2d([wsize(1) wsize(2)], [1 wsize(2)], [1 wsize(1)]);
[out,r] = imwarp(face_img, trans_mat, 'OutputView', RA);
m_time=toc;
%opencv
tic;
res_img = cv.warpAffine(face_img,T2,'DSize',wsize,'WarpInverse',false);
o_time=toc;
if isShow
disp(['matlab相似变换的时间: ' num2str(m_time)]);
disp(['opencv相似变换的时间: ' num2str(o_time)]);
figure(1);
subplot(2,2,1);
imshow(img);
subplot(2,2,2);
imshow(out,[]);
hold on;
for j = 1:nlandmark
plot(warp_landmark(j,1),warp_landmark(j,2),'.r','markersize',15);
end
pause();
end
end
时间:
matlab相似变换的时间: 0.0083993
opencv相似变换的时间: 0.00037726