Commit 69700855 authored by Daniel Drake's avatar Daniel Drake

Implement identification for imaging devices

parent 3f70d6f7
LIBRARY
=======
identification
test suite against NFIQ compliance set
make library optionally asynchronous and maybe thread-safe
nbis cleanups
......
......@@ -81,10 +81,6 @@
*
* \section identification Identification
*
* libfprint supports enrollment and verification as described above. Although
* libfprint does not yet support identification (it is planned), it is worth
* introducing the concept to give you a complete picture.
*
* Identification is the process of comparing a freshly scanned fingerprint
* to a <em>collection</em> of previously enrolled fingerprints. For example,
* imagine there are 100 people in an organisation, and they all have enrolled
......
......@@ -225,6 +225,8 @@ int fpi_img_to_print_data(struct fp_img_dev *imgdev, struct fp_img *img,
struct fp_print_data **ret);
int fpi_img_compare_print_data(struct fp_print_data *enrolled_print,
struct fp_print_data *new_print);
int fpi_img_compare_print_data_to_gallery(struct fp_print_data *print,
struct fp_print_data **gallery, int match_threshold, int *match_offset);
#endif
......@@ -364,6 +364,25 @@ int fpi_img_compare_print_data(struct fp_print_data *enrolled_print,
return r;
}
int fpi_img_compare_print_data_to_gallery(struct fp_print_data *print,
struct fp_print_data **gallery, int match_threshold, int *match_offset)
{
struct xyt_struct *pstruct = (struct xyt_struct *) print->data;
struct fp_print_data *gallery_print;
int probe_len = bozorth_probe_init(pstruct);
size_t i = 0;
while (gallery_print = gallery[i++]) {
struct xyt_struct *gstruct = (struct xyt_struct *) gallery_print->data;
int r = bozorth_to_gallery(probe_len, pstruct, gstruct);
if (r >= match_threshold) {
*match_offset = i - 1;
return FP_VERIFY_MATCH;
}
}
return FP_VERIFY_NO_MATCH;
}
/** \ingroup img
* Get a binarized form of a standardized scanned image. This is where the
* fingerprint image has been "enhanced" and is a set of pure black ridges
......
......@@ -305,6 +305,46 @@ static int img_dev_verify(struct fp_dev *dev,
return FP_VERIFY_NO_MATCH;
}
static int img_dev_identify(struct fp_dev *dev,
struct fp_print_data **print_gallery, size_t *match_offset,
struct fp_img **_img)
{
struct fp_img_dev *imgdev = dev->priv;
struct fp_img_driver *imgdrv = fpi_driver_to_img_driver(dev->drv);
struct fp_img *img = NULL;
struct fp_print_data *print;
int match_score = imgdrv->bz3_threshold;
int r;
r = fpi_imgdev_capture(imgdev, 0, &img);
/* If we got an image, standardize it and return it even if the scan
* quality was too low for processing. */
if (img)
fp_img_standardize(img);
if (_img)
*_img = img;
if (r)
return r;
r = fpi_img_to_print_data(imgdev, img, &print);
if (r < 0)
return r;
if (img->minutiae->num < MIN_ACCEPTABLE_MINUTIAE) {
fp_dbg("not enough minutiae, %d/%d", r, MIN_ACCEPTABLE_MINUTIAE);
fp_print_data_free(print);
return FP_VERIFY_RETRY;
}
if (match_score == 0)
match_score = BOZORTH3_DEFAULT_THRESHOLD;
r = fpi_img_compare_print_data_to_gallery(print, print_gallery,
match_score, match_offset);
fp_print_data_free(print);
return r;
}
void fpi_img_driver_setup(struct fp_img_driver *idriver)
{
idriver->driver.type = DRIVER_IMAGING;
......@@ -312,5 +352,6 @@ void fpi_img_driver_setup(struct fp_img_driver *idriver)
idriver->driver.exit = img_dev_exit;
idriver->driver.enroll = img_dev_enroll;
idriver->driver.verify = img_dev_verify;
idriver->driver.identify = img_dev_identify;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment