The goal is to get only valid and good quality fingerprint images from scanner device. The ideal would be one best quality fingerprint image for each finger touch on scanner's scanning surface.

The problem is that scanner device is returning all images it scans (even empty or fingerprint residues).

One of correct designs of fingerprint scanning process is following:

  1. When you detect that finger was put on the scanner (first non-empty image), start checking the quality of obtained fingerprint images, when quality is > your_quality_threshold then take next N fingerprint images and pick the one with best quality. The motivation is that you should not stop with fingerprint image which satisfies your fingerprint quality threshold, most of images will have much better quality, but you have to wait till finger is placed on fingerprint scanner surface well.
  2. After you get the high quality fingerprint you start waiting for empty fingerprint image (waiting for person to remove its finger from scanner). When empty image was detected you can continue in 1. step. 
For example:
- N = 3

- Empty image detection: You can calculate magnitude of white color in image (in case that empty image is white), then you determine some threshold for the scanner. Notice that fingerprint scanner surface can be dirty so you can get some "black points" even in case of no finger on scanning surface therefore the "whiteness threshold" is needed.

       3. Fingerprint quality:

Ansi/Iso SDK: IEngine_GetImageQuality
IDKit SDK: IEngine_GetFingerprintQuality (after extraction) - what will take long time for multiple fingerprints because of time-consuming template extraction process
Segmentation SDK:  ISegLib_GetImageQuality or ISegLib_NFIQScore

Segmentation SDK: ISegLib_GetPlacementScore - is sophisticated method which can improve quality of captured fingerprint images tremendously. It can be used as last quality check in above described fingerprint image acquisition process.