?? facesymexamdk.m
字號:
function SDdnf=FaceSymExamd(P)
% 計算人臉的鏡像對稱距離SDdnf
% P為檢測出的特征點(眼睛和嘴巴)的坐標組成的2*3的數組
% P3是嘴的坐標,將其設為原點
Temp0=zeros(1,3);
P1=ones(3,3); % 坐標變換
for j=1:1:3
for i=1:1:2
P1(i,j)=P(i,j);
end
end
Matrix0=[1 0 0;0 1 0;-P(1,3) -P(2,3) 1]; % 嘴位置移至原點的平移變換矩陣
for j=1:1:3
if j==1
for i=1:1:3
Temp0(i)=P1(i,j);
end
Temp1=Temp0*Matrix0;
elseif j==2
for i=1:1:3
Temp0(i)=P1(i,j);
end
Temp2=Temp0*Matrix0;
elseif j==3
for i=1:1:3
Temp0(i)=P1(i,j);
end
Temp3=Temp0*Matrix0;
end
end
% 計算兩個眼睛的中點M(Mx,My)
T=zeros(1,2);
for i=1:1;2
if i==1
T(i)=(Temp1(i)+Temp2(i))/2;
elseif i==2
T(i)=(Temp1(i)+Temp2(i))/2;
end
end
a=atan(Temp1(2)/Temp1(1));
b=atan(Temp2(2)/Temp2(1));
k=atan(T(2)/T(1));
d=2*(pi/2-k);
RefMatrix=[-cos(d) sin(d) 0;sin(d) cos(d) 0;0 0 1]; % RefMatix為以OM為對稱軸的鏡像對稱變換矩陣
Temp4=ones(1,3);
for i=1:1:2
Temp4(i)=P1(i,2);
end
T1=Temp4*RefMatrix; % 關于鏡像對稱軸做旋轉變換P',T1為左側眼睛位置
Px=(Temp1(1)+T1(1))/2; % 旋轉后點的平均點的x坐標值P0
Py=(Temp1(2)+T1(2))/2; % 旋轉后點的平均點的y坐標值
RefMatrixN=inv(RefMatrix); % RefMatrix的逆矩陣
Temp4(1)=Px;
Temp4(2)=Py;
T2=Temp4*RefMatrixN; % 關于鏡像對稱軸反向旋轉變換得到P*,T2為右側眼睛位置
% 將特征點移到原來的位置(以嘴部為基準)
Matrix0N=inv(Matrix0);
for j=1:1:3
if j==1
Temp1=T1*Matrix0N;
elseif j==2
Temp2=T2*Matrix0N;
elseif j==3
Temp3=Temp3*Matrix0N;
end
end
P2=zeros(2,3);
for j=1:1:3
if j==1
for i=1:1:2
P2(i,j)=Temp1(i);
end
elseif j==2
for i=1:1:2
P2(i,j)=Temp2(i);
end
elseif j==3
for i=1:1:2
P2(i,j)=Temp3(i);
end
end
end
% 計算SDdnf
SDdnf=0;
for j=1:1:3
for i=1:1:2
SDdnf=SDdnf+(P2(i,j)-P(i,j))^2;
end
if j==3
SDdnf=SDdnf/3;
end
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -