Skip to content
/ fcmb Public
forked from thederickff/fcmb

A fingerprint program that connects with a Futronic devices and uses the Cwsq, Mindtct and Bozorth3 to check whether a fingerprint match or not with a existing fingerprint gallery.

License

Notifications You must be signed in to change notification settings

carpajr/fcmb

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

82 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Futronic with NIST SDK - FCMB

This project is a fork of the Derick Felix FCMB project, and the main contribution of this version is to source a little enhancement on the reader extraction process and some awareness about how NIST (The National Institute of Standards and Technology) tools work.

The libraries sourced by futronic are responsible for extracting biometric images that are used in NIST tools to extract minutiae, generate templates, and compare biometric fingerprint.

Disclaimer: I'm not a specialist in this field.

Process to extract biometric data

  1. CWSQ: gets as input the image in grayscale generated by the fingerprint reader and convert, compressing it, to Wavelet Scalar Quantization algorithm (WSQ) format. WSQ format and CWSQ are both developed by NIST.

  2. MINDTCT: the minutiae detector extracts fingerprint minutiae and builds a list of coordinates representing a graph structure (.xyt file). Each node is a minutia, a particular point in a fingerprint that in a set usually identify a person.

  3. BOZORTH3: compare a fingerprint with another or with a dataset and generates a similarity ranking. The ranking must be evaluated with a dataset to set up a feasible threshold limit to recognize a person.

Compatibility

  • Linux (x86 and ARM)

Instalation

Binaries

Available in release

Source code

git clone https://github.com/carpajr/fcmb
cd fcmb
make all 

Usage

Minutiae extraction

fcmb <directory> <name>

  • name: person identification that can be the person-name or person-name-finger
  • directory: where *.xyt files will be generated

When you run fcmb, the software executes:

  1. Using CWSQ, convert a bitmap in a WSQ file
exec/cwsq 2.25 wsq {{directory}}/{{name}}.bmp -raw_in 320,480,8
  1. Using MINDTCT extracts minutiae of WSQ file
exec/mindtct {{directory}}/{{name}}.wsq {{directory}}/{{name}}

Comparison process

  1. Comparing a person 1:1
exec/bozorth3 -T 40 -A outfmt=spg -p data/user.xyt data/Hamlet_fingerA3.xyt
Expected result:
408 data/user.xyt data/Hamlet_finger_A3.xyt
  1. Comparing a person with a dataset or 1:n
exec/bozorth3 -T 40 -A outfmt=spg -p data/user.xyt data/*.xyt
Expected result:
61 data/user.xyt data/Hamlet_finger_A1.xyt
97 data/user.xyt data/Hamlet_finger_A2.xyt
408 data/user.xyt data/Hamlet_finger_A3.xyt

Note: A1, A2, A3 represents fingerprints that were extracted after positioning the same finger three times with subtle different positions.

Where:

  • -T is a threshold param - only fingerprints with more than 40 minutiae will be compared
  • -A outfmt=spg - shows the score, source, and found biometry

Consult other options using: exec/bozorth3 --help

Demo

It was created a directory called dataset in fcmb folder to store user data

raspberry:~/fcmb# mkdir -p dataset/bmp
raspberry:~/fcmb# tree
.
├── bin
│   └── main.cpp
├── dataset
│   ├── bmp
├── exec

│   ├── bozorth3
│   ├── cwsq
│   └── mindtct
├── fcmb
├── include
│   ├── Cwsq.h
│   ├── ftrScanAPI.h
│   ├── Mindtct.h
│   ├── Scanner.h
│   ├── Scanner.h.1
│   └── Utils.h
├── lib
│   ├── ftrScanAPI.a
│   ├── ftrScanAPI.dll
│   ├── ftrScanAPI.lib
│   ├── libScanAPI_linux_arm.so
│   ├── libScanAPI_linux_x86.so
│   ├── libusb-0.1_linux_arm.so
│   └── libusb-0.1_linux_x86.so
├── LICENSE
├── Makefile
├── README.md
└── src
    ├── Cwsq.cpp
    ├── Mindtct.cpp
    ├── Scanner.cpp
    ├── Scanner.cpp.1
    └── Utils.cpp

Extracting fingerprint biometry

Demo Extracting

Comparison

Demo Comparison

Overall

The demo was made with poor data using just my fingers to illustrate how the process works and to show the ranking values.

fingerprint ranking
yellow-finger (recaptured) 30 (blue finger) / 91 (yellow finger)
blue-finger (recaptured) 36 (blue finger) / 7 (yellow finger)
finger not recorded on dataset 8 (blue finger) / 7 (yellow finger)

If I will choose a value bigger than 30 as the threshold, both fingers could be detected correctly. But it not seems to be a good strategy and I reckon that using more templates per finger is a way to make threshold higher and to recognize with less uncertainty.

Limitations

Comparison is a time-consuming task and is a concern when an application intends to have many users.

Acknowledge

Credits to Derick that shared the knowledge explored here.

About

A fingerprint program that connects with a Futronic devices and uses the Cwsq, Mindtct and Bozorth3 to check whether a fingerprint match or not with a existing fingerprint gallery.

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C++ 56.6%
  • C 41.1%
  • Makefile 2.3%