相似变换

Main.m

% headpose_with_block/ini_shape
clc;clearvars;close all;
data=load('../data_temp/data.mat','data');
data=data.data;

meanshape=calc_meanshape2(data);
ind=1;
img=imread(data{ind}.imgPath);%color image
landmark=data{ind}.landmark;%landmark 10*2,其中landmark的坐标是相对于box的偏移
nlandmark=size(landmark,1);% n=10
box=data{ind}.bbox;%[x y w h]
figure(1);
subplot(1,2,1);
imshow(img);
title('原图像');
hold on;
for i=1:nlandmark
    plot(landmark(i,1)+box(1),landmark(i,2)+box(2),'.r','markersize',15);
end

%显示平均形状

minxy=min(meanshape,[],1);
maxxy=max(meanshape,[],1);
shape=meanshape.*80+10;%尺度扩大80,+10是为平移到中间位置

img2=255*ones(100,100,3);
subplot(1,2,2);
imshow(img2);
title('平均形状的可视化');
hold on;
for i=1:nlandmark
    plot(shape(i,1),shape(i,2),'.r','markersize',15);
end

%% 计算相似变换
%%计算两个中心化的形状之间的相似变换
meanxy=mean(landmark,1);%landmark的中心
mean_shapexy=mean(meanshape,1);%meanshape的中心
 temp1=bsxfun(@minus,landmark,meanxy);
 temp2=bsxfun(@minus,meanshape,mean_shapexy).*100;%放置到100*100的标准框架中
 %from meanshape to landmark,计算相似变换矩阵
 %理论上,令T=trans_mat.T,T(3,1)=T(3,2)=0,即T中的tx=ty=0
trans_mat = fitgeotrans(bsxfun(@minus,meanshape,mean_shapexy).*100,bsxfun(@minus,landmark,meanxy), 'NonreflectiveSimilarity');

T=trans_mat.T;
wsize=[20 20];%目标的大小

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)=landmark(1,1)+box(1)-(T2(1,1)*(wsize(1)-1)/2+T2(1,2)*(wsize(2)-1)/2);
T2(2,3)=landmark(1,2)+box(2)-(T2(2,1)*(wsize(1)-1)/2+T2(2,2)*(wsize(2)-1)/2);
%仿射逆变换,T2是从wsize窗口到图像中的仿射变换,其和trans_mat是统一的。
result=cv.warpAffine(img,T2,'DSize',wsize,'WarpInverse',1);
figure(2);
subplot(1,2,1);
imshow(img);
title('原图像');
hold on;
plot(landmark(1,1)+box(1),landmark(1,2)+box(2),'.r','markersize',15);
subplot(1,2,2);
imshow(result);
title('目标图像');
hold on;
plot((wsize(1)-1)/2,(wsize(2)-1)/2,'.r','markersize',30);

这里写图片描述
这里写图片描述

计算公式:

(xxiyyi)=(a1b1a2b2)(xwcxywcy)

其中 xi=landmark(1,1),yj=landmark(1,2) , x,y 是关于图像img中的坐标, x,y 是关于大小为wsize的目标图像中的坐标。 wcxwcy 表示目标图像的中心。
通过上面的公式,我们分离 x,y,x,y 即可得到相似变换矩阵为:

(xy)=(a1b1a2b2xi(a1wcx+a2wcy)yi(b1wcx+b2wcy))xy1

这里写图片描述

如上图,左右图像分别给出了坐标轴。左图:人脸图像给出了10个基准点,黄色的点是其中的一个基准点,绿色的点为以黄色点为中心的邻域内的一点。 c0 是10个基准点的重心(质心),也是图中坐标系的原点。右图:给出了一个大小为100*100的框架,并将平均人脸映射到该框架内进行了可视化。同样的 c0 是中心, c1 是其中的一个基准点。

假定左图像绿色点的坐标为 (x,y) ,右边图像绿色点的坐标为 (x,y)

证明:

(xxc0yyc0)=(a1b1a2b2)(xxc0yyc0)

可以推出:
(xxc1yyc1)=(a1b1a2b2)(xxc1yyc1)

注释:隐含条件:
(xc1xc0yc1yc0)=(a1b1a2b2)(xc1xc0yc1yc0)


备注:因为上面是相似变换,因此满足:
a1=b2,a2=b1

OpenCV和Matlab

OpenCV中计算形式为:

(xy)=(abbatxty)xy1=Toxy1

Matlab中的计算形式为:

(xy)=(xy1)abtxbaty001=(xy1)Tm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值