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.
-
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.
-
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.
-
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.
- Linux (x86 and ARM)
Available in release
git clone https://github.com/carpajr/fcmb
cd fcmb
make all
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:
- Using CWSQ, convert a bitmap in a WSQ file
exec/cwsq 2.25 wsq {{directory}}/{{name}}.bmp -raw_in 320,480,8
- Using MINDTCT extracts minutiae of WSQ file
exec/mindtct {{directory}}/{{name}}.wsq {{directory}}/{{name}}
- 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
- 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
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
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.
Comparison is a time-consuming task and is a concern when an application intends to have many users.
Credits to Derick that shared the knowledge explored here.