распознавание лиц с использованием функций surf и дерева поиска knn

#matlab #face-recognition #surf #knn #matlab-cvst

#matlab #распознавание лиц #surf #knn #matlab-cvst

Вопрос:

я работал над проектом по распознаванию лиц с использованием функций surf и дерева поиска knn с использованием matlab 2014A проблема, с которой я сталкиваюсь, заключается в том, что я не могу сопоставить результаты из дерева поиска knn вручную с каждым файлом в базе данных, чтобы я мог указать, какое лицо больше всего напоминает образец. Кто-нибудь может мне помочь, как найти трех ближайших соседей в базе данных? это мой код

% Объединить все функции в набор данных у меня есть 128 функций surf для каждого лица в базе данных featureDataset = double(vertcat(ImageCollection.featureVectors));

 % instantiate a kd tree
imageFeatureKDTree = KDTreeSearcher(featureDataset);

query.wholeImage = imread('F:trio.jpg');

faceDetector = vision.CascadeObjectDetector();
bbox            = step(faceDetector, query.wholeImage)
Out=query.wholeImage;
for k = 1:size(bbox,1)

figure; axesHandle=axes; imshow(query.wholeImage); title('Query Image');
rectangleHandle=imrect(axesHandle,bbox(k,:)) ;

% Consider only selected region
query.image=imcrop(query.wholeImage,getPosition(rectangleHandle));
query.image=rgb2gray(query.image);
% Detect SURF features
query.points = detectSURFFeatures(query.image);
% Extract SURF descriptors
[query.featureVectors,query.points] = ...
    extractFeatures(query.image,query.points,'SURFSize',128);


[matches, distance] = knnsearch(imageFeatureKDTree,query.featureVectors,'Distance','euclidean','K',3);
indexIntervals = [0, cumsum([imageCollection.featureCount])]   1;
counts = histc(matches(:, 1), indexIntervals);
counts1=histc(matches(:, 2), indexIntervals);
counts2=histc(matches(:, 3 ), indexIntervals);
if max(counts)==0
    disp('No Features Matched')
else
    for i = 1:numel(imageCollection) % Scale each image

if (counts(i)==max(counts))        
name=srcFiles(i).name;

end
if (counts(i)==max(counts1))        
name1=srcFiles(i).name;

end
if (counts(i)==max(counts2))        
name2=srcFiles(i).name;
end
    end
    t1 = strcmpi(name(1:10),name1(1:10));t2=strcmpi(name(1:10),name2(1:10));
t3=strcmpi(name1(1:10),name2(1:10));
if((t1==1)||(t2==1)||(t3==1))
Out = insertObjectAnnotation(Out,'rectangle',bbox(k,:),name(1:length(name)-1));
else if (t3==1)

Out = insertObjectAnnotation(Out,'rectangle',bbox(k,:),name1(1:length(name)-1));
    else
Out = insertObjectAnnotation(Out,'rectangle',bbox(k,:),'not matched');
    end
end
end
end
imshow(Out)