⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fpextractdemo.m

📁 简单的指纹识别算法代码,带测试图片.非商业代码.
💻 M
📖 第 1 页 / 共 3 页
字号:
    switch angle<8
        case (angle==0),
            set(get(ud.hComponent1Axes, 'title'), 'string', '0 degree Component');
            set(ud.hComponent1Image, 'Cdata', img);
        case (angle==1),
            set(get(ud.hComponent2Axes, 'title'), 'string', '22.5 degree Component');
            set(ud.hComponent2Image, 'Cdata', img);
        case (angle==2),
            set(get(ud.hComponent3Axes, 'title'), 'string', '45 degree Component');
            set(ud.hComponent3Image, 'Cdata', img);
        case (angle==3),
            set(get(ud.hComponent4Axes, 'title'), 'string', '67.5 degree Component');
            set(ud.hComponent4Image, 'Cdata', img);
        case (angle==4),
            set(get(ud.hComponent5Axes, 'title'), 'string', '90 degree Component');
            set(ud.hComponent5Image, 'Cdata', img);
        case (angle==5),
            set(get(ud.hComponent6Axes, 'title'), 'string', '112.5 degree Component');
            set(ud.hComponent6Image, 'Cdata', img);
        case (angle==6),
            set(get(ud.hComponent7Axes, 'title'), 'string', '135 degree Component');
            set(ud.hComponent7Image, 'Cdata', img);
        case (angle==7),
            set(get(ud.hComponent8Axes, 'title'), 'string', '157.5 degree Component');
            set(ud.hComponent8Image, 'Cdata', img);
        otherwise 
            error('Nothing !');
    end
    
end

set(DemoFig,'Pointer','arrow');
setstatus(DemoFig,'Finished Convolution');
set(DemoFig, 'UserData', ud);
drawnow
%==========================================================================
%%%
%%%  Sub-Function - Features
%%%

function Features(DemoFig)
% 
load 'informations.dat' -mat

if nargin<1
    DemoFig = gcbf;
end
set(DemoFig,'Pointer','watch');
setstatus(DemoFig,'Convoluting with eight Gabor filters in process...');
ud=get(DemoFig,'Userdata');
fingerprint = getimage(ud.hOriginalImage);

fingerprint = fingerprint*graylevmax;

N=175;
num_disk=8;

[BinarizedPrint,XofCenter,YofCenter]=centralizing(fingerprint,0);
[CroppedPrint]=cropping(XofCenter,YofCenter,fingerprint);
[NormalizedPrint,vector]=sector_norm(CroppedPrint,0,1);

for (angle=0:1:num_disk-1)
    
    gabor=gabor2d_sub(angle,num_disk);
    z2=gabor;
    z1=NormalizedPrint;
    z1x=size(z1,1);
    z1y=size(z1,2);
    z2x=size(z2,1);
    z2y=size(z2,2);    
    ComponentPrint=real(ifft2(fft2(z1,z1x+z2x-1,z1y+z2y-1).*fft2(z2,z1x+z2x-1,z1y+z2y-1)));    
    px=((z2x-1)+mod((z2x-1),2))/2;
    py=((z2y-1)+mod((z2y-1),2))/2;
    ComponentPrint=ComponentPrint(px+1:px+z1x,py+1:py+z1y);
    
    [disk,vector]=sector_norm(ComponentPrint,1,0);
    
    img = double(ComponentPrint)/graylevmax;
    img1 = double(disk)/51200;
    switch angle<8
        case (angle==0),
            set(get(ud.hComponent1Axes, 'title'), 'string', '0 degree Features');
            set(ud.hComponent1Image, 'Cdata', img1);
        case (angle==1),
            set(get(ud.hComponent2Axes, 'title'), 'string', '22.5 degree Features');
            set(ud.hComponent2Image, 'Cdata', img1);
        case (angle==2),
            set(get(ud.hComponent3Axes, 'title'), 'string', '45 degree Features');
            set(ud.hComponent3Image, 'Cdata', img1);
        case (angle==3),
            set(get(ud.hComponent4Axes, 'title'), 'string', '67.5 degree Features');
            set(ud.hComponent4Image, 'Cdata', img1);
        case (angle==4),
            set(get(ud.hComponent5Axes, 'title'), 'string', '90 degree Features');
            set(ud.hComponent5Image, 'Cdata', img1);
        case (angle==5),
            set(get(ud.hComponent6Axes, 'title'), 'string', '112.5 degree Features');
            set(ud.hComponent6Image, 'Cdata', img1);
        case (angle==6),
            set(get(ud.hComponent7Axes, 'title'), 'string', '135 degree Features');
            set(ud.hComponent7Image, 'Cdata', img1);
        case (angle==7),
            set(get(ud.hComponent8Axes, 'title'), 'string', '157.5 degree Features');
            set(ud.hComponent8Image, 'Cdata', img1);
        otherwise 
            error('Nothing !');
    end
    
end

set(DemoFig,'Pointer','arrow');
setstatus(DemoFig,'Features were extracted');
set(DemoFig, 'UserData', ud);
drawnow
%==========================================================================

%==========================================================================
%%%
%%%  Sub-Function - FingerCode
%%%

function Fingercode(DemoFig)
% 
load 'informations.dat' -mat

if nargin<1
    DemoFig = gcbf;
end


set(DemoFig,'Pointer','watch');
setstatus(DemoFig,'FingerCode in process...');
ud=get(DemoFig,'Userdata');
fingerprint = getimage(ud.hOriginalImage);

fingerprint = fingerprint*graylevmax;

N=175;
num_disk=8;


[BinarizedPrint,XofCenter,YofCenter]=centralizing(fingerprint,0);
[CroppedPrint]=cropping(XofCenter,YofCenter,fingerprint);
[NormalizedPrint,vector]=sector_norm(CroppedPrint,0,1);

for (angle=0:1:num_disk-1)    
    gabor=gabor2d_sub(angle,num_disk);
    z2=gabor;
    z1=NormalizedPrint;
    z1x=size(z1,1);
    z1y=size(z1,2);
    z2x=size(z2,1);
    z2y=size(z2,2);    
    ComponentPrint=real(ifft2(fft2(z1,z1x+z2x-1,z1y+z2y-1).*fft2(z2,z1x+z2x-1,z1y+z2y-1)));    
    px=((z2x-1)+mod((z2x-1),2))/2;
    py=((z2y-1)+mod((z2y-1),2))/2;
    ComponentPrint=ComponentPrint(px+1:px+z1x,py+1:py+z1y);        
    [disk,vector]=sector_norm(ComponentPrint,1,0);    
    %img = double(ComponentPrint)/graylevmax;
    %img1 = double(disk)/51200;
    finger_code1{angle+1}=vector(1:36);
end

load('informations.dat','img','-mat');
img=imrotate(img,22.5/2);
imgN=size(img,1);
imgM=size(img,2);
modN=mod(imgN,8);
modM=mod(imgM,8);
fingerprint=double(img(modN+1:imgN,modM+1:imgM));

[BinarizedPrint,XofCenter,YofCenter]=centralizing(fingerprint,0);
[CroppedPrint]=cropping(XofCenter,YofCenter,fingerprint);
[NormalizedPrint,vector]=sector_norm(CroppedPrint,0,1);

for (angle=0:1:num_disk-1)    
    gabor=gabor2d_sub(angle,num_disk);
    z2=gabor;
    z1=NormalizedPrint;
    z1x=size(z1,1);
    z1y=size(z1,2);
    z2x=size(z2,1);
    z2y=size(z2,2);    
    ComponentPrint=real(ifft2(fft2(z1,z1x+z2x-1,z1y+z2y-1).*fft2(z2,z1x+z2x-1,z1y+z2y-1)));    
    px=((z2x-1)+mod((z2x-1),2))/2;
    py=((z2y-1)+mod((z2y-1),2))/2;
    ComponentPrint=ComponentPrint(px+1:px+z1x,py+1:py+z1y);        
    [disk,vector]=sector_norm(ComponentPrint,1,0);    
    %img = double(ComponentPrint)/graylevmax;
    %img1 = double(disk)/51200;
    finger_code2{angle+1}=vector(1:36);
end
% FingerCode added to database
if (exist('fp_database.dat')==2)
    load('fp_database.dat','-mat');
    fp_number=fp_number+1;
    data{fp_number,1}=finger_code1;
    data{fp_number,2}=finger_code2;
    save('fp_database.dat','data','fp_number','-append');
else
    fp_number=1;
    data{fp_number,1}=finger_code1;
    data{fp_number,2}=finger_code2;
    save('fp_database.dat','data','fp_number');
end

message=strcat('FingerCode was succesfully added to database. Fingerprint no. ',num2str(fp_number));
msgbox(message,'FingerCode DataBase','help');

set(DemoFig,'Pointer','arrow');
setstatus(DemoFig,'FingerCode calculated');
set(DemoFig, 'UserData', ud);
drawnow
%==========================================================================

%==========================================================================
%%%
%%%  Sub-Function - Check
%%%

function Check(DemoFig)
% 
load 'informations.dat' -mat

if nargin<1
    DemoFig = gcbf;
end


set(DemoFig,'Pointer','watch');
setstatus(DemoFig,'DataBase Scanning...');
ud=get(DemoFig,'Userdata');
fingerprint = getimage(ud.hOriginalImage);

fingerprint = fingerprint*graylevmax;

N=175;
num_disk=8;


[BinarizedPrint,XofCenter,YofCenter]=centralizing(fingerprint,0);
[CroppedPrint]=cropping(XofCenter,YofCenter,fingerprint);
[NormalizedPrint,vector]=sector_norm(CroppedPrint,0,1);

for (angle=0:1:num_disk-1)    
    gabor=gabor2d_sub(angle,num_disk);
    z2=gabor;
    z1=NormalizedPrint;
    z1x=size(z1,1);
    z1y=size(z1,2);
    z2x=size(z2,1);
    z2y=size(z2,2);    
    ComponentPrint=real(ifft2(fft2(z1,z1x+z2x-1,z1y+z2y-1).*fft2(z2,z1x+z2x-1,z1y+z2y-1)));    
    px=((z2x-1)+mod((z2x-1),2))/2;
    py=((z2y-1)+mod((z2y-1),2))/2;
    ComponentPrint=ComponentPrint(px+1:px+z1x,py+1:py+z1y);        
    [disk,vector]=sector_norm(ComponentPrint,1,0);    
    %img = double(ComponentPrint)/graylevmax;
    %img1 = double(disk)/51200;
    finger_code{angle+1}=vector(1:36);
end


% FingerCode of input fngerprint has just been calculated.
% Checking with BadaBase
if (exist('fp_database.dat')==2)
    load('fp_database.dat','-mat');
    %---- alloco memoria -----------------------------------
    ruoto1=zeros(36,1);
    ruoto2=zeros(36,1);
    vettore_d1=zeros(12,1);
    vettore_d2=zeros(12,1);
    best_matching=zeros(fp_number,1);
    % start checking ---------------------------------------
    for scanning=1:fp_number
        fcode1=data{scanning,1};
        fcode2=data{scanning,2};
        for rotazione=0:1:11
            d1=0;
            d2=0;
            for disco=1:8
                f1=fcode1{disco};
                f2=fcode2{disco};
                % ora ruoto f1 ed f2  della rotazione ciclica ----------
                for old_pos=1:12
                    new_pos=mod(old_pos+rotazione,12);
                    if (new_pos==0)
                        new_pos=12;
                    end
                    ruoto1(new_pos)=f1(old_pos);
                    ruoto1(new_pos+12)=f1(old_pos+12);
                    ruoto1(new_pos+24)=f1(old_pos+24);
                    ruoto2(new_pos)=f2(old_pos);
                    ruoto2(new_pos+12)=f2(old_pos+12);
                    ruoto2(new_pos+24)=f2(old_pos+24);
                end
                %-------------------------------------------------------
                d1=d1+norm(finger_code{disco}-ruoto1);
                d2=d2+norm(finger_code{disco}-ruoto2);                
            end
            vettore_d1(rotazione+1)=d1;
            vettore_d2(rotazione+1)=d2;
        end
        [min_d1,pos_min_d1]=min(vettore_d1);
        [min_d2,pos_min_d2]=min(vettore_d2);
        if min_d1<min_d2
            minimo=min_d1;
        else
            minimo=min_d2;
        end
        best_matching(scanning)=minimo;
    end
    [distanza_minima,posizione_minimo]=min(best_matching);
    beep;
    message=strcat('The nearest fingerprint present in DataBase which matchs input fingerprint is  : ',num2str(posizione_minimo),...
                         ' with a distance of : ',num2str(distanza_minima));
    msgbox(message,'DataBase Info','help');
    %-------------------------------------------------------
    
else
    message='DataBase is empty. No check is possible.';
    msgbox(message,'FingerCode DataBase Error','warn');    
end



set(DemoFig,'Pointer','arrow');
setstatus(DemoFig,'DataBase Scanning completed');
set(DemoFig, 'UserData', ud);
drawnow
%==========================================================================

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -