MeanOfWeightedSquaredDotProducts.M 脚本下载地址:
(https://download.csdn.net/download/ephemeroptera/11003123)
附上实现代码:
%% (1)get eye image
man = im2double(rgb2gray(imread('man.jpg')));
faceDetector = vision.CascadeObjectDetector('FrontalFaceCART');
LeftEyeDetector = vision.CascadeObjectDetector('ClassificationModel','LeftEyeCART','UseROI',true);
facebbox = faceDetector(man);
leftEyebbox = LeftEyeDetector(man,facebbox(1,:));
leftEye = imcrop(man,leftEyebbox(1,:));
figure(1),imshow(leftEye)
%% gaussian and invert
faceEdge = max(facebbox(1,3:4));
sigma = 0.005*faceEdge;
temp = fspecial('gaussian',[5,5],sigma);
leftEye2 = imfilter(leftEye,temp,'symmetric','corr');
Wc = 1 - leftEye2;
%% get eye image gradient
[px,py] = gradient(leftEye);
grad = abs(px)+abs(py);
% ignore smooth area
T = 0.3*std(grad(:))+mean(grad(:));
grad(grad<T) = 0;
%% in order to calculate each dot products with vector d and vector g ,we build a struct M
[x,y]= meshgrid(1:size(leftEye,1),1:size(leftEye,2));
M = cat(3,grad,x,y,px,py);
%% calculate each respond of c
C = zeros(size(leftEye));
for i = 1: size(leftEye,1)
for j = 1: size(leftEye,2)
C(i,j) = MeanOfWeightedSquaredDotProducts(M,Wc,i,j);
end
end
%% post-processing
% remove extrem high values
% C(C>0.9*max(C(:)))=0;
% remove border velues
C(1,:)=0;
C(end,:)=0;
C(:,1)=0;
C(:,end)=0;
%% get location of the maximum value as centre
MaxValue = max(C(:));
[centreY,centreX] = find(C==MaxValue);
%% show centre
eyeCentre = insertMarker(leftEye,[centreX,centreY]);
figure(2),imshow(eyeCentre);