Click here to Skip to main content
Licence CPOL
First Posted 30 Jul 2010
Views 107,604
Downloads 9,419
Bookmarked 231 times

A Framework in C# for Fingerprint Verification

In this article, we introduce a framework in C# for fingerprint verification, we briefly explain how to perform fingerprint verification experiments and how to integrate your algorithms to the framework.
Prize winner in Competition "Best C# article of July 2010"
2 votes, 1.7%
1

2
1 vote, 0.9%
3
6 votes, 5.1%
4
108 votes, 92.3%
5
4.95/5 - 117 votes
3 removed
μ 4.88, σa 1.03 [?]

Introduction

Fingerprint recognition [1] is an active research area nowadays. An important component in fingerprint recognition systems is the fingerprint matching algorithm. According to the problem domain, fingerprint matching algorithms are classified in two categories: fingerprint verification algorithms and fingerprint identification algorithms. The aim of fingerprint verification algorithms is to determine whether two fingerprints come from the same finger or not. On the other hand, the fingerprint identification algorithms search a query fingerprint in a database looking for the fingerprints coming from the same finger.

There are hundreds of papers concerning fingerprint verification but, as far as we know, there isn't any framework for fingerprint verification available on the web. So, you must implement your own tools in order to test the performance of your fingerprint verification algorithms. Moreover, you must spend a lot of time implementing algorithms of other authors to compare with your algorithms. This was our motivation to put our fingerprint verification framework available for everyone.

The most closely related work to our framework is the FVC-onGoing web system. This system has the following limitations:

  • You do not have access to any algorithm but yours.
  • It is not a framework; so, you cannot reuse any software component.
  • It cannot be used with educational purpose because students cannot see how the algorithms work.
  • After performing an experiment using a database (standard or hard), you must wait 30 days to perform another experiment using the same database.
  • You do not have control over the fingerprint databases. Thus, you cannot use your own databases neither modify the existing ones.
  • You do not have access to the fingerprints that your algorithm fails matching. Hence, you cannot analyze why the algorithm fails in order to fix your code.
  • You cannot create an experiment with a custom protocol for performance evaluation.

If any of the above mentioned limitations constitute a problem for you, then you should use our framework.

Our framework is implemented in C# with .NET Framework for two main reasons. First, C# has become one of the most popular programming languages. Second, the technologies, tools and class libraries available in the .NET Framework save us a lot of time of coding.

Our framework allows performing fingerprint verification experiments for databases B of FVC2000, FVC2002 and FVC2004; and databases A of FVC2004. In this experiment, we use the performance indicators of the Fingerprint Verification Competitions [2] (EER(%), FMR100(%), FMR1000(%), ZeroFMR(%), Time(ms) and ROC curves). Additionally, you can include experiments with a custom evaluation protocol or different databases.

We implemented the fingerprint verification algorithms proposed by Tico and Kuosmanen [3], Jiang and Yau [4], Medina-Pérez et al. [5], Parziale and Niel [6], and Qi et al. [7]. It is important to highlight that, despite the algorithm of Qi et al. is a combination of a minutiae matching algorithm with an orientation based algorithm, we implemented only the minutiae matching algorithm. This framework allows you to include new fingerprint matching algorithms as well as new feature extraction algorithms with minimum effort and without recompiling the framework.

One of the goals that we kept in mind while developing this framework was to achieve class interfaces as simple as possible. This way, adding new algorithms is pretty straightforward.

We hope this work motivates you and more people to collaborate with us in order to implement more algorithms.

In this article, we briefly explain how:

  • to perform fingerprint verification experiments
  • to see the matching minutiae after performing an experiment with a minutiae based algorithm
  • to compute and display features from certain fingerprint
  • to integrate your algorithms to the framework

Before Using the Framework

With this article, we provide the following files:

Before doing anything else, download the binary files containing the features of the fingerprints at http://rapidshare.com/files/409648016/FingerprintFeatures.rar. Then, extract the file FingerprintFeatures.rar and populate the directories with the image of fingerprints available at:

Running a Fingerprint Verification Experiment

Extract the file “FingerprintRecognition.zip” and build the solution. Then you can debug the project “FR.FVCExperimenter” or you can execute “FR.FVCExperimenter.exe” in the directory containing the generated assemblies. The following window will open:

In the “Resources” text box, specify the path of the database that you are going to use, for example: “D:\PR Databases\Fingerprints\FVC2004\DB1_B”.

Select the proper experiment type in the combo box with label “Experiment”. Select value “FVCDB_B” if you are going to perform an experiment with any of the databases DB1_B, DB2_B, DB3_B or DB4_B. Select value “FVC2004DB_A” if you are going to perform an experiment with any of the databases DB1_A, DB2_A, DB3_A or DB4_A of FVC2004.

Use the combo boxes “Minutia Extractor”, “Orientation Image Extractor” and “Skeleton Image Extractor“ to select the algorithms that will be used to compute the basic features (minutiae, orientation image and skeleton image). Sadly, we are not specialists in digital image processing. That is why we only implemented the algorithm proposed by Ratha et al. [8] to extract orientation images. The minutiae and skeleton images were computed by a collaborator which gave us these features saved in binary files. We hope this work motivates you and more people to collaborate with us in order to implement other feature extraction algorithms as well as matching algorithms.

Use the combo box with label “Matcher” to select a fingerprint verification algorithm, and the combo box with label “Feature Provider” to select the algorithm that will be used to store and retrieve the features for the selected matcher. Despite the fact that we implemented only one feature provider for each matcher, there are possible scenarios where you may have multiple feature providers for each matcher.

The grid with label “Properties” allows changing the parameters of any selected algorithm.

Click on “Execute Experiment” button to run the experiment. This experiment uses the evaluation protocol of the Fingerprint Verification Competitions [2]. The performance indicators computed in this experiments are: EER(%), FMR100(%), FMR1000(%), ZeroFMR(%), Time(ms) and ROC curves. These indicators are saved in a file whose name is formed by the name of the matching algorithm concatenated with ".Summary.csv". This file is saved in a folder by the name of "Results" in the same folder where the fingerprints are stored. Two more files are saved, one file containing the false matching fingerprints and the other containing the false non matching fingerprints.

If you want to match two fingerprints and verify the coincident minutiae, then click the “Visual Match” button which will open the “Visual Fingerprint Matching” form. Load the fingerprints that you want to compare and click the “Match” button. The feature extractors and matcher selected in the “FVC Experimenter” are also used here to perform the fingerprint matching. The following is an example of matching two fingerprints:

Visualizing Features

If you want to visualize features for certain fingerprint, then you can use “FR.FeatureDisplay” project. In “Fingerprint Feature Display” form, you can change the feature extractor and feature display. In the framework, we include classes to visualize minutiae, orientation image and skeleton image.

The following is an example visualizing the orientation image of a fingerprint:

Adding New Algorithms to the Framework

The first thing that you need to know is that you do not need to modify the applications of the framework in order to recognize your algorithms because we use Reflection to load all algorithms dynamically at execution time.

You may create as many assemblies as you want in the directory containing the framework. For each new assembly, go to the properties and set the output path with value “..\bin\Release\”.

In order to add a new feature extractor, you must inherit from the generic class FeatureExtractor<T> and implement the method ExtractFeatures(Bitmap image). For example, suppose that you want to create an extractor for features of type MyFeature, then you could implement a class like the following:

public class MyFeatureExtractor : FeatureExtractor<MyFeature>
{
	public override MyFeature ExtractFeatures(Bitmap image)
	{
		// Place your code here to extract features
	}       
}

In case your new features are built upon some existing features, then you can do like follows:

public class MyFeatureExtractor : FeatureExtractor<MyFeature>
{     
    public FeatureExtractor<List<Minutia>> MtiaExtractor { set; get; }

    public FeatureExtractor<OrientationImage> OrImgExtractor { set; get; }

    public override MyFeature ExtractFeatures(Bitmap image)
    {
	try
        {
             var mtiae = MtiaExtractor.ExtractFeatures(image);
             var orImg = OrImgExtractor.ExtractFeatures(image);
             return ExtractFeatures(mtiae, orImg);
        }
        catch (Exception)
        {
             if (MtiaExtractor == null)
                throw new InvalidOperationException
		("Cannot extract MyFeature: Unassigned minutia list extractor!");
             if (OrImgExtractor == null)
                throw new InvalidOperationException
		("Cannot extract MyFeature: Unassigned orientation image extractor!");
             throw;
        }
    }

    public MyFeature ExtractFeatures(List<Minutia> mtiae, OrientationImage orImg)
    {
        // Place your code here to extract features
    }       
}

For each feature extractor, you must create a resource provider. Resource providers allow saving (retrieving) to (from) file the resources associated to fingerprints. The framework includes resource providers for extractors of minutiae (MinutiaListProvider), orientation image (OrientationImageProvider) and skeleton image (SkeletonImageProvider). The following is an example of a resource provider for the feature extractor defined above.

public class MyFeatureProvider : ResourceProvider<MyFeature>
{
    public MinutiaListProvider MtiaListProvider { get; set; }

    public OrientationImageProvider OrImgProvider { get; set; }

    public override string GetSignature()
    {
        return "myf";
        
    }

    public override bool IsResourcePersistent()
    {
        return true;
    }

    protected override MyFeature Extract
	(string fingerprint, ResourceRepository repository)
    {
        try
        {
            var mtiae = MtiaListProvider.GetResource(fingerprint, repository);
            var orImg = OrImgProvider.GetResource(fingerprint, repository);
            return featureExtractor.ExtractFeatures(mtiae, orImg);
        }
        catch (Exception)
        {
            if (MtiaListProvider == null)
                throw new InvalidOperationException
		("Unable to extract MyFeature: Unassigned minutia list provider!");
            if (OrImgProvider == null)
                throw new InvalidOperationException
	        ("Unable to extract MyFeature: Unassigned orientation image provider!");
            throw;
        }
    }

    private MyFeatureExtractor featureExtractor = new MyFeatureExtractor();
} 

Now, it is time to create a new fingerprint matching algorithm. Suppose that you want to match features of type MyFeature, then you must create a matcher like this:

public class MyMatcher : Matcher<MyFeature>
{        
    public override double Match(MyFeature query, MyFeature template)
    {
        // Place your code here to match fingerprints
    }
}

In case you are implementing a minutia matching algorithm, then you should modify the above code as follows:

public class MyMatcher : Matcher<MyFeature>, IMinutiaMatcher
{        
    public override double Match(MyFeature query, MyFeature template)
    {
        List<MinutiaPair> matchingMtiae;
        return Match(query, template, out matchingMtiae);
    }

    public double Match
	(object query, object template, out List<MinutiaPair> matchingMtiae)
    {
        // Place your code here to match fingerprints
    }
}

Conclusions

In this article, we introduce a framework in C# for fingerprint verification. We briefly explain how to perform fingerprint verification experiments and how to integrate your algorithms to the framework. We provide several matching algorithms that you can use not only for experimental purpose, but also to create your own applications. We provide the source code of all the algorithms so the user can reuse any part of the code as well as any software component.

References

  1. D. Maltoni, D. Maio, A. K. Jain, and S. Prabhakar, Handbook of fingerprint recognition, Second ed. London: Springer-Verlag, 2009.
  2. R. Cappelli, D. Maio, D. Maltoni, J. L. Wayman, and A. K. Jain, "Performance evaluation of fingerprint verification systems," IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 28, pp. 3-18, 2006.
  3. M. Tico and P. Kuosmanen, "Fingerprint matching using an orientation-based minutia descriptor," IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 25, pp. 1009-1014, 2003.
  4. X. Jiang and W. Y. Yau, "Fingerprint minutiae matching based on the local and global structures," in 15th International Conference on Pattern Recognition, Barcelona, Spain, 2000, pp. 1038-1041.
  5. M. A. Medina-Pérez, A. Gutiérrez-Rodríguez, and M. García-Borroto, "Improving fingerprint matching using an orientation-based minutia descriptor," in 14th Iberoamerican Congress on Pattern Recognition, CIARP 2009, Guadalajara, México, 2009, pp. 121-128.
  6. G. Parziale and A. Niel, "A fingerprint matching using minutiae triangulation," in 1st International Conference on Biometric Authentication, Hong Kong, China, 2004, pp. 241-248.
  7. J. Qi, S. Yang, and Y. Wang, "Fingerprint matching combining the global orientation field with minutia," Pattern Recognition Letters, vol. 26, pp. 2424-2430, 2005.
  8. N. Ratha, S. Chen, and A. K. Jain, "Adaptive flow orientation-based feature extraction in fingerprint images," Pattern Recognition, vol. 28, pp. 1657-1672, 1995.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Authors

Miguel Angel Medina Pérez

Engineer

Cuba Cuba

Member
Miguel Angel Medina Pérez received the B.S. and M.S. degrees from the University of Ciego de Ávila, Cuba, in 2007. He is a PhD student at the National Institute of Astrophysics, Optics and Electronics (México). His research interests include pattern recognition and fingerprint recognition.
 
Relevant publications:
 
1. M. A. Medina-Pérez, M. García-Borroto, A. E. Gutierrez-Rodriguez, and L. Altamirano-Robles, "Robust fingerprint verification using m-triplets," in International Conference on Hand-Based Biometrics (ICHB 2011), Hong Kong, 2011, pp. 1-5.
2. M. García-Borroto, J. F. Martínez-Trinidad, J. A. Carrasco-Ochoa, M. A. Medina-Pérez, and J. Ruiz-Shulcloper, "LCMine: An Efficient Algorithm for Mining Discriminative Regularities and its Application in Supervised Classification," Pattern Recognition, vol. 43, pp. 3025-3034, 2010.
3. A. E. Gutierrez-Rodriguez, M. A. Medina-Perez, J. F. Martinez-Trinidad, J. A. Carrasco-Ochoa, and M. Garcia-Borroto, "New Dissimilarity Measures for Ultraviolet Spectra Identification," Lecture Notes in Computer Science, vol. 6256, pp. 220-229, 2010.
4. M. A. Medina-Pérez, A. Gutiérrez-Rodríguez, and M. García-Borroto, "Improving Fingerprint Matching Using an Orientation-Based Minutia Descriptor," Lecture Notes in Computer Science, vol. 5856, pp. 121-128, 2009.
5. M. A. Medina-Pérez, M. García-Borroto, and J. Ruiz-Shulcloper, "Object Selection Based on Subclass Error Correcting for ALVOT," Lecture Notes in Computer Science, vol. 4756, pp. 496-505, 2007.
6. M. A. Medina-Pérez, M. García-Borroto, Y. Villuendas-Rey, and J. Ruiz-Shulcloper, "Selecting Objects for ALVOT," Lecture Notes in Computer Science, vol. 4225, pp. 606-613, 2006.
7. Y. Villuendas-Rey, M. García-Borroto, M. A. Medina-Pérez, and J. Ruiz-Shulcloper, "Simultaneous Features and Objects Selection for Mixed and Incomplete Data," Lecture Notes in Computer Science, vol. 4225, pp. 597-605, 2006.

Andres Eduardo Gutierrez Rodriguez



Cuba Cuba

Member
Andres Eduardo Gutierrez Rodriguez is graduated from Las Villas Central University, Cuba, in 2006. He received the M.S. degree in 2009 from the University of Ciego de Ávila, Cuba. His research interests are pattern recognition and biometry.
 
Relevant papers:
 
-M. A. Medina-Pérez, A. Gutiérrez-Rodríguez, and M. García-Borroto, "Improving Fingerprint Matching Using an Orientation-Based Minutia Descriptor," Lecture Notes in Computer Science, vol. 5856, pp. 121-128, 2009.
-A. E. Gutierrez-Rodriguez, M. A. Medina-Perez, J. F. Martinez-Trinidad, J. A. Carrasco-Ochoa, and M. Garcia-Borroto, "New Dissimilarity Measures for Ultraviolet Spectra Identification," Lecture Notes in Computer Science, vol. 6256, pp. 220-229, 2010.

Milton García Borroto



Cuba Cuba

Member
Milton García-Borroto is graduated from Las Villas Central University, Cuba, in 2000. He received the M.S. degree in 2007 from the National Institute of Astrophisics, Optics and Electronics, Mexico, where he continues his studies toward a Ph.D. degree. His research interests are pattern recognition and biometry.
 
Relevant papers:
1. M. García-Borroto, J. F. Martinez Trinidad, J. A. Carrasco Ochoa, M. A. Medina-Pérez, and J. Ruiz-Shulcloper. LCMine: An efficient algorithm for mining discriminative regularities and its application in supervised classification. Pattern Recognition vol. 43, pp. 3025-3034, 2010.
2. M. García-Borroto, J. F. Martinez Trinidad, J. A. Carrasco Ochoa. A New Emerging Pattern Mining Algorithm and Its Application in Supervised Classification. M.J. Zaki et al. (Eds.): PAKDD 2010, Part I, Lecture Notes in Artificial Intelligence, vol. 6118, pp. 150–157, 2010.
3. M. A. Medina-Pérez, A. Gutiérrez-Rodríguez, and M. García-Borroto, "Improving Fingerprint Matching Using an Orientation-Based Minutia Descriptor," Lecture Notes in Computer Science, vol. 5856, pp. 121-128, 2009.
4. M. García-Borroto, Y. Villuendas-Rey, J. A. Carrasco-Ochoa, and J. F. Martínez-Trinidad, "Finding Small Consistent Subset for the Nearest Neighbor Classifier Based on Support Graphs," Lecture Notes in Computer Science, vol. 5856, pp. 465-472, 2009.
5. M. García-Borroto, Y. Villuendas-Rey, J. A. Carrasco-Ochoa, and J. F. Martínez-Trinidad, "Using Maximum Similarity Graphs to Edit Nearest Neighbor Classifiers," Lecture Notes in Computer Science, vol. 5856, pp. 489-496, 2009.
6. M. A. Medina-Pérez, M. García-Borroto, and J. Ruiz-Shulcloper, "Object Selection Based on Subclass Error Correcting for ALVOT," Lecture Notes in Computer Science, vol. 4756, pp. 496-505, 2007.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralMy vote of 5 PinmemberFardan22hrs 32mins ago 
GeneralRe: My vote of 5 PinmemberMiguel Angel Medina Pérez19hrs 59mins ago 
Questionit's a Excellent Article about the Fingerprint Verification but i have one question Pinmemberfireofwin3:33 24 Jan '12  
AnswerRe: it's a Excellent Article about the Fingerprint Verification but i have one question PinmemberMiguel Angel Medina Pérez6:38 24 Jan '12  
GeneralRe: it's a Excellent Article about the Fingerprint Verification but i have one question Pinmemberfireofwin22:19 28 Jan '12  
GeneralRe: it's a Excellent Article about the Fingerprint Verification but i have one question PinmemberMiguel Angel Medina Pérez12:25 30 Jan '12  
QuestionImageProcessingTools.dll not found PinmemberPoovan Moorthy20:11 23 Jan '12  
AnswerRe: ImageProcessingTools.dll not found PinmemberMiguel Angel Medina Pérez6:26 24 Jan '12  
GeneralRe: ImageProcessingTools.dll not found PinmemberPoovan Moorthy9:05 25 Jan '12  
AnswerRe: ImageProcessingTools.dll not found PinmemberMiguel Angel Medina Pérez11:09 25 Jan '12  
GeneralRe: ImageProcessingTools.dll not found PinmemberPoovan Moorthy2:15 1 Feb '12  
AnswerRe: ImageProcessingTools.dll not found PinmemberMiguel Angel Medina Pérez11:22 8 Feb '12  
GeneralMy vote of 5 Pinmemberkhalid20129:23 23 Nov '11  
GeneralRe: My vote of 5 PinmemberMiguel Angel Medina Pérez11:41 12 Dec '11  
QuestionMy vote of 5 -> Pinmemberkasunt7:21 26 Oct '11  
AnswerRe: My vote of 5 -> PinmemberMiguel Angel Medina Pérez8:10 26 Oct '11  
QuestionDon't get it Pinmemberghvnd5:22 14 Oct '11  
AnswerRe: Don't get it PinmemberMiguel Angel Medina Pérez6:29 14 Oct '11  
GeneralMy vote of 3 Pinmembersmss1238:05 7 Oct '11  
GeneralMy vote of 5 Pinmemberambarishtv6:39 30 Apr '11  
GeneralRe: My vote of 5 PinmemberMiguel Angel Medina Pérez13:30 1 May '11  
GeneralMy vote of 5 PinmvpDalek Dave4:13 7 Jan '11  
GeneralRe: My vote of 5 PinmemberMiguel Angel Medina Pérez7:06 7 Jan '11  
GeneralFantastic article PinmemberMarcelo Ricardo de Oliveira4:41 3 Jan '11  
GeneralRe: Fantastic article PinmemberMiguel Angel Medina Pérez11:25 5 Jan '11  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web01 | 2.5.120209.1 | Last Updated 19 Aug 2010
Article Copyright 2010 by Miguel Angel Medina Pérez, Andres Eduardo Gutierrez Rodriguez, Milton García Borroto
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid