Enrollment 28.2.0
Loading...
Searching...
No Matches

The library can be used to segment slaps and extract templates from prints. More...

Classes

class  ModalitiesEmbeddingVerifyMatcher
 ModalitiesEmbeddingVerifyMatcher is template matcher that uses Innovatrics proprietary verification algorithm. More...
class  ANSITemplate
 ANSI INCITS 378 print compliant template. More...
class  ANSITemplateAdapter
 Adapts Template to ANSITemplate. More...
class  CriticalPoint
 It represents a particular CriticalPoint. More...
class  CriticalPointShape
 It draws CriticalPoint into image. More...
class  CriticalPointsShape
 It draws collection of CriticalPoint into image. More...
class  EmbeddingExtractor
class  EmbeddingMatcher
 It is general matcher for Embedding templates. More...
class  EmbeddingVerifyMatcher
 EmbeddingVerifyMatcher is template matcher that uses Innovatrics proprietary verification algorithm. More...
class  ICSExtractor
 ICSExtractor creates ICS, Innovatrics proprietary print template. More...
class  ICSVerifyMatcher
 ICSVerifyMatcher is template matcher that uses Innovatrics proprietary verification algorithm. More...
class  IdentificationEmbeddingExtractor
 EmbeddingExtractor creates Innovatrics proprietary embedding print template. More...
class  ILOSIDTemplate
 International Labour Organisation Seafarers Identity Document template. More...
class  ILOSIDTemplateAdapter
 Adapts Template to ILOSIDTemplate. More...
class  ISOCCTemplate
 ISO/IEC 19794-2:2005 template, template version 2.0, 3-byte format for minutiae (compact card encoding). More...
class  ISOCCTemplateAdapter
 Adapts Template to ISOCCTemplate. More...
class  ISONCTemplate
 ISO/IEC 19794-2:2005 template, template version 2.0, 5-byte format for minutiae (normal card encoding). More...
class  ISONCTemplateAdapter
 Adapts Template to ISONCTemplate. More...
class  ISOTemplate
 ISO/IEC 19794-2 print compliant template. More...
class  ISOTemplateAdapter
 Adapts Template to ISOTemplate. More...
class  Minutia
 It represents a particular Minutia (distinctive fingerprint feature point found in fingerprint skeleton, such as a bifurcation or an ending). More...
class  MinutiaShape
 It draws Minutia into image. More...
class  MinutiaeShape
 It draws Minutia into image. More...
class  Print
 It holds all functions and data related to print manipulation. More...
class  PrintAttributes
 Print attributes Holds the print attributes. More...
class  PrintCaptureDeviceTypeID
 Capture device type identifier The capture device type identifier shall identify the biometric organization that owns the product that created the BDIR. More...
class  PrintCaptureDeviceVendorID
 Capture device vendor identifier The capture device vendor identifier shall identify the biometric organization that owns the product that created the BDIR. More...
class  PrintCapture
 It holds all functions and data related to print manipulation. More...
class  GuessedHandPosition
 It represents guessed hand position of Slap. More...
class  SlapCapture
 It represents PrintCapture with Slap. More...
class  ThumbsCapture
 It represents PrintCapture with ThumbsCapture. More...
class  PrintDetectorConfig
 General configuration of PrintDetector. More...
class  PrintDetector
 PrintDetector implements segmentation by means of Innovatrics ISegLib library. More...
class  AlgorithmicSegmentation
 AlgorithmicSegmentation implements algorithmic segmentation from Innovatrics ISegLib library. More...
class  NeuralSegmentation
 NeuralSegmentation implements segmentation based on neural network from Innovatrics ISegLib library. More...
class  GlobalPrintExecutor
 Holds instance of PrintExecutor. More...
class  PrintCropConfiguration
 Holds print cropping configuration. More...
class  PrintSegment
 Segment detected in print capture Usually the segment has also position that is assigned by segmentation algorithm. More...
class  PrintTemplate
 Holds various biometric representation types for print. More...

Typedefs

using PrintSimilarityScore = unsigned int
 It is similarity score between print Templates.

Enumerations

enum class  PrintCaptureDeviceTechnology : uint8_t {
  UNKNOWN = 0 , WHITE_LIGHT_OPTICAL_TIR = 1 , WHITE_LIGHT_OPTICAL_DIRECT = 2 , WHITE_LIGHT_OPTICAL_TOUCHLESS = 3 ,
  MONOCHROMATIC_VISIBLE_OPTICAL_TIR = 4 , MONOCHROMATIC_VISIBLE_OPTICAL_DIRECT = 5 , MONOCHROMATIC_VISIBLE_OPTICAL_TOUCHLESS = 6 , MONOCHROMATIC_VISIBLE_IR_OPTICAL_TIR = 7 ,
  MONOCHROMATIC_VISIBLE_IR_OPTICALTOUCHLESS = 8 , MONOCHROMATIC_VISIBLE_IR_OPTICAL = 9 , MULTISPECTRAL_OPTICAL_TIR = 10 , MULTISPECTRAL_OPTICAL_DIRECT = 11 ,
  MULTISPECTRAL_OPTICAL_TOUCHLESS = 12 , ELECTRO_LUMINESCENT = 13 , SEMICONDUCTOR_CAPACITIVE = 14 , SEMICONDUCTOR_RF = 15 ,
  SEMICONDUCTOR_THERMAL = 16 , PRESSURE_SENSITIVE = 17 , ULTRASOUND = 18 , MECHANICAL = 19 ,
  GLASS_FIBER = 20
}
 It shall indicate the class of capture device technology used to acquire the captured biometric sample [5]. More...
enum class  PrintImpression : uint8_t {
  LIVE_SCAN_PLAIN = 0 , LIVE_SCAN_ROLLED = 1 , NONLIVE_SCAN_PLAIN = 2 , NONLIVE_SCAN_ROLLED = 3 ,
  LATENT_IMPRESSION = 4 , LATENT_TRACING = 5 , LATENT_PHOTO = 6 , LATENT_LIFT = 7 ,
  LIVE_SCAN_SWIPE = 8 , LIVE_SCAN_VERTICAL_ROLL = 9 , LIVE_SCAN_PALM = 10 , NONLIVE_SCAN_PALM = 11 ,
  LATENT_PALM_IMPRESSION = 12 , LATENT_PALM_TRACING = 13 , LATENT_PALM_PHOTO = 14 , LATENT_PALM_LIFT = 15 ,
  LIVE_SCAN_OPTICAL_CONCTACTLESS_PLAIN = 24 , OTHER = 28 , UNKNOWN = 29
}
 It is impression of prints [5]. More...
enum class  PrintPosition : uint8_t {
  RIGHT_THUMB = 1 , RIGHT_INDEX = 2 , RIGHT_MIDDLE = 3 , RIGHT_RING = 4 ,
  RIGHT_LITTLE = 5 , LEFT_THUMB = 6 , LEFT_INDEX = 7 , LEFT_MIDDLE = 8 ,
  LEFT_RING = 9 , LEFT_LITTLE = 10 , RIGHT_FULL_PALM = 21 , RIGHT_WRITERS_PALM = 22 ,
  LEFT_FULL_PALM = 23 , LEFT_WRITERS_PALM = 24 , RIGHT_LOWER_PALM = 25 , RIGHT_UPPER_PALM = 26 ,
  LEFT_LOWER_PALM = 27 , LEFT_UPPER_PALM = 28 , RIGHT_INTERDIGITAL = 31 , RIGHT_THENAR = 32 ,
  RIGHT_HYPOTHENAR = 33 , LEFT_INTERDIGITAL = 34 , LEFT_THENAR = 35 , LEFT_HYPOTHENAR = 36
}
 It is position of finger on hands. More...

Functions

static constexpr int PrintToIsoCaptureDeviceTechnology (PrintCaptureDeviceTechnology printCaptureDeviceTechnology)
 Function converts PrintCaptureDeviceTechnology to ISO capture technology.
static constexpr PrintCaptureDeviceTechnology IsoToPrintCaptureDeviceTechnology (int isoCaptureDeviceTechnology)
 Function converts ISO capture technology to PrintCaptureDeviceTechnology.
static constexpr int PrintToIsoImpression (PrintImpression printImpression)
 Function converts PrintImpression to ISO impression.
static constexpr PrintImpression IsoToPrintImpression (int isoImpression)
 Function converts ISO impression to PrintImpression.
static constexpr PrintPosition IsoToPrintPosition (int isoPosition)
 Function converts ISO position to PrintPosition.
static constexpr int PrintToIsoPosition (PrintPosition position)
 Function converts Print position to ISO position.

Detailed Description

The library can be used to segment slaps and extract templates from prints.

Overview

The library can be used to segment slaps and extract templates from prints. The library can process following print types

We are able to segment Slap and provide segmented Prints for further processing. Usually the processing is template extraction from Print. The library provides ICSExtractor to extract Print.

Slap

Slap is image of usually 4 fingers. It can be segmented and result of segmentation is PrintSegment. Usually the fingertip has also position that is assigned by segmentation algorithm. The position of found fingertip on hand is estimated by comparing the x-coordinate of the center of the finger's bounding box rectangle. As a result, the estimation may not be precise for slaps with an angle greater than 45 degrees. When the segmentation algorithm does not detect position then it is necessary that user sets correct position to be possible to create Print for further processing.

We provides following algorithm for segmentation process:

Slap

It can be segmented with function Slap::SegmentWith that return segmented rectangles.

  • c++
    const auto dpi = 1000;
    auto img = Image::Decode(BinaryFile::ReadAll("assets/slap.png"), dpi);
    auto slap = SlapCapture::Create(std::move(img), HandPosition::RIGHT);
    cfg.SetMaxRotation(10);
    AlgorithmicSegmentation segmentation(cfg);
    unsigned int fingerIndex = 0;
    auto segments = slap->SegmentWith(segmentation);
    for (auto& segment : segments)
    {
    const std::string file =
    "output/slap_segment_" + std::to_string(fingerIndex) + ".png";
    segment->ToPrint()->image->SaveAs(file);
    fingerIndex++;
    }
    slap->Draw(segments, Shapes::InnoBlue)->SaveAs("output/slap_segments.png");
  • java
    final int dpi = 1000;
    Image img = Image.Decode(BinaryFile.ReadAll("assets/slap.png"), dpi);
    SlapCapture slap = SlapCapture.Create(img, HandPosition.RIGHT);
    AlgorithmicSegmentation.Config cfg = AlgorithmicSegmentation.Config.Default();
    AlgorithmicSegmentation segmentation = new AlgorithmicSegmentation(cfg);
    int fingerIndex = 0;
    PrintSegments segments = slap.SegmentWith(segmentation);
    for (PrintSegment segment : segments) {
    segment.ToPrint().getImage().SaveAs(
    "output/slap_segment_" + fingerIndex + ".png");
    fingerIndex++;
    }
    slap.Draw(segments, Shapes.InnoBlue).SaveAs("output/slap_segments.png");
  • csharp
    const int dpi = 1000;
    Image img = Image.Decode(BinaryFile.ReadAll("assets/slap.png"), dpi);
    SlapCapture slap = SlapCapture.Create(img, HandPosition.RIGHT);
    uint fingerIndex = 0;
    AlgorithmicSegmentation.Config cfg = AlgorithmicSegmentation.Config.Default();
    AlgorithmicSegmentation segmentation = new AlgorithmicSegmentation(cfg);
    PrintSegments segments = slap.SegmentWith(segmentation);
    foreach (PrintSegment segment in segments)
    {
    segment.ToPrint().image.SaveAs("output/slap_segment_" + fingerIndex + ".png");
    fingerIndex++;
    }
    slap.Draw(segments, Shapes.InnoBlue).SaveAs("output/slap_segments.png");

The output of example is segmented slap

Segmented Slap

and cropped segments

Slap Segment 1
Slap Segment 2
Slap Segment 3
Slap Segment 4

Modify segment dimensions and crop

It is possible to use crop configuration (PrintCropConfiguration) when creating prints from PrintSegment. It is also possible to modified segment dimension via function PrintSegment::Resize.

  • c++
    auto img = Image::Decode(BinaryFile::ReadAll("assets/canted_slap_left.png"));
    auto slap = SlapCapture::Create(std::move(img), HandPosition::LEFT);
    NeuralSegmentation segmentation;
    PrintCropConfiguration cropCfg;
    cropCfg.SetBackgroundColor(Colors::InnoBlue);
    cropCfg.SetImageDimensions(400, 500);
    auto segments = slap->SegmentWith(segmentation);
    auto modifiedSegments = segments;
    // Get aligned fingerprint into image with dimension 400x500
    segments[0]->ToPrint(cropCfg)->image->SaveAs("output/slap_segment_crop_0.png");
    // Resize rounding box to absolute values and get aligned fingerprint into image
    // with dimension 400x500
    modifiedSegments[1] = segments[1]->Resize(400.0F, 500.F);
    modifiedSegments[1]->ToPrint(cropCfg)->image->SaveAs(
    "output/slap_segment_crop_1.png");
    // Resize rounding box relatively to original one and get not aligned fingerprint
    // into image with dimension 400x500
    cropCfg.EnableAlignedCropping(false);
    auto segment2 = segments[2];
    modifiedSegments[2] = segment2->Resize(segment2->roundingBox.GetWidth() * 1.3F,
    segment2->roundingBox.GetHeight() * 1.5F);
    modifiedSegments[2]->ToPrint(cropCfg)->image->SaveAs(
    "output/slap_segment_crop_2.png");
    // Resize rounding box to absolute values and get aligned fingerprint into image
    // with dimensions same as rounding box. The default crop configuration is used in
    // ToPrint() function.
    modifiedSegments[3] = segments[3]->Resize(300.0F, 400.0F);
    modifiedSegments[3]->ToPrint()->image->SaveAs("output/slap_segment_crop_3.png");
    // Draw segments into image. Original one as light gray and modified as blue
    auto segmentsImage =
    slap->image->DrawShape(SegmentsShape(segments, modifiedSegments));
    segmentsImage->SaveAs("output/slap_segment_crop.png");
  • java
    Image img = Image.Decode(BinaryFile.ReadAll("assets/canted_slap_left.png"));
    SlapCapture slap = SlapCapture.Create(img, HandPosition.LEFT);
    NeuralSegmentation segmentation = new NeuralSegmentation();
    PrintCropConfiguration cropCfg = new PrintCropConfiguration();
    cropCfg.SetBackgroundColor(Colors.InnoBlue);
    cropCfg.SetImageDimensions(400, 500);
    PrintSegments segments = slap.SegmentWith(segmentation);
    PrintSegments modifiedSegments = new PrintSegments(segments);
    // Get aligned fingerprint into image with dimension 400x500
    segments.get(0).ToPrint(cropCfg).getImage().SaveAs(
    "output/slap_segment_crop_0.png");
    // Resize rounding box to absolute values and get aligned fingerprint into image
    // with dimension 400x500
    modifiedSegments.set(1, segments.get(1).Resize(400.0F, 500.0F));
    modifiedSegments.get(1).ToPrint(cropCfg).getImage().SaveAs(
    "output/slap_segment_crop_1.png");
    // Resize rounding box relatively to original one and get not aligned
    // fingerprint
    // into image with dimension 400x500
    cropCfg.EnableAlignedCropping(false);
    PrintSegment segment2 = segments.get(2);
    modifiedSegments.set(
    2, segment2.Resize(segment2.getRoundingBox().GetWidth() * 1.3F,
    segment2.getRoundingBox().GetHeight() * 1.5F));
    modifiedSegments.get(2).ToPrint(cropCfg).getImage().SaveAs(
    "output/slap_segment_crop_2.png");
    // Resize rounding box to absolute values and get aligned fingerprint into image
    // with dimensions same as rounding box. The default crop configuration is used
    // in ToPrint() function.
    modifiedSegments.set(3, segments.get(3).Resize(300.0F, 400.0F));
    modifiedSegments.get(3).ToPrint().getImage().SaveAs(
    "output/slap_segment_crop_3.png");
    // Draw segments into image. Original one as light gray and modified as blue
    Image segmentsImage = slap.getImage().DrawShape(
    new SegmentsShape(segments, modifiedSegments));
    segmentsImage.SaveAs("output/slap_segment_crop.png");
  • csharp
    Image img = Image.Decode(BinaryFile.ReadAll("assets/canted_slap_left.png"));
    SlapCapture slap = SlapCapture.Create(img, HandPosition.LEFT);
    NeuralSegmentation segmentation = new NeuralSegmentation();
    PrintCropConfiguration cropCfg = new PrintCropConfiguration();
    cropCfg.SetBackgroundColor(Colors.InnoBlue);
    cropCfg.SetImageDimensions(400, 500);
    PrintSegments segments = slap.SegmentWith(segmentation);
    PrintSegments modifiedSegments = new PrintSegments(segments);
    // Get aligned fingerprint into image with dimension 400x500
    segments[0].ToPrint(cropCfg).image.SaveAs("output/slap_segment_crop_0.png");
    // Resize rounding box to absolute values and get aligned fingerprint into image
    // with dimension 400x500
    modifiedSegments[1] = segments[1].Resize(400.0F, 500.0F);
    modifiedSegments[1].ToPrint(cropCfg).image.SaveAs(
    "output/slap_segment_crop_1.png");
    // Resize rounding box relatively to original one and get not aligned fingerprint
    // into image with dimension 400x500
    cropCfg.EnableAlignedCropping(false);
    PrintSegment segment2 = segments[2];
    modifiedSegments[2] = segment2.Resize(segment2.roundingBox.GetWidth() * 1.3F,
    segment2.roundingBox.GetHeight() * 1.5F);
    modifiedSegments[2].ToPrint(cropCfg).image.SaveAs(
    "output/slap_segment_crop_2.png");
    // Resize rounding box to absolute values and get aligned fingerprint into image
    // with dimensions same as rounding box. The default crop configuration is used in
    // ToPrint() function.
    modifiedSegments[3] = segments[3].Resize(300.0F, 400.0F);
    modifiedSegments[3].ToPrint().image.SaveAs("output/slap_segment_crop_3.png");
    // Draw segments into image. Original one as light gray and modified as blue
    Image segmentsImage =
    slap.image.DrawShape(new SegmentsShape(segments, modifiedSegments));
    segmentsImage.SaveAs("output/slap_segment_crop.png");

The output of example is segmented slap (Original segments are light gray and modified are blue)

Modified Segmented Slap

and cropped segments

Modified Slap Segment 1
Modified Slap Segment 2
Modified Slap Segment 3
Modified Slap Segment 4

Hand position

Guess hand position. It is possible to guess hand position when slap contains at least 3 segments. The hand position can be obtained by function SlapCapture::GuessHandPosition.

  • c++
    const auto dpi = 1000;
    auto img = Image::Decode(BinaryFile::ReadAll("assets/slap.png"), dpi);
    auto slap = SlapCapture::Create(std::move(img), HandPosition::RIGHT);
    AlgorithmicSegmentation segmentation{};
    auto segments = slap->SegmentWith(segmentation);
    auto guessedHand = SlapCapture::GuessHandPosition(segments);
    if (guessedHand.IsGuessSuccessful())
    {
    std::cout << " Guessed hand position " << guessedHand.GetHandPosition()
    << std::endl;
    }
  • java
    final int dpi = 1000;
    Image img = Image.Decode(BinaryFile.ReadAll("assets/slap.png"), dpi);
    SlapCapture slap = SlapCapture.Create(img, HandPosition.RIGHT);
    AlgorithmicSegmentation segmentation = new AlgorithmicSegmentation();
    PrintSegments segments = slap.SegmentWith(segmentation);
    GuessedHandPosition guessedHand = SlapCapture.GuessHandPosition(segments);
    if (guessedHand.IsGuessSuccessful()) {
    System.out.println(
    " Guessed hand position " + guessedHand.GetHandPosition());
    }
  • csharp
    const int dpi = 1000;
    Image img = Image.Decode(BinaryFile.ReadAll("assets/slap.png"), dpi);
    SlapCapture slap = SlapCapture.Create(img, HandPosition.RIGHT);
    AlgorithmicSegmentation segmentation = new AlgorithmicSegmentation();
    PrintSegments segments = slap.SegmentWith(segmentation);
    GuessedHandPosition guessedHand = SlapCapture.GuessHandPosition(segments);
    if (guessedHand.IsGuessSuccessful())
    {
    System.Console.WriteLine(" Guessed hand position " +
    guessedHand.GetHandPosition());
    }

Thumbs

Thumbs is image of both thumbs. When 2 segments are detected then first is left and second is right thumb. When only one thumb is detected then position is unknown and user MUST set correct position to be possible to create Print for further processing.

We provides following algorithm for segmentation process:

Thumbs

It can be segmented with function Thumbs::SegmentWith that return segmented rectangles.

  • c++
    auto img = Image::Decode(BinaryFile::ReadAll("assets/thumbs.png"));
    auto thumbs = ThumbsCapture::Create(std::move(img));
    cfg.SetMaxRotation(10);
    AlgorithmicSegmentation segmentation(cfg);
    unsigned int fingerIndex = 0;
    auto segments = thumbs->SegmentWith(segmentation);
    for (auto& segment : segments)
    {
    const std::string file =
    "output/thumbs_segment_" + std::to_string(fingerIndex) + ".png";
    segment->ToPrint()->image->SaveAs(file);
    fingerIndex++;
    }
    thumbs->Draw(segments, Shapes::InnoBlue)->SaveAs("output/thumbs_segments.png");
  • java
    Image img = Image.Decode(BinaryFile.ReadAll("assets/thumbs.png"));
    ThumbsCapture thumbs = ThumbsCapture.Create(img);
    AlgorithmicSegmentation.Config cfg = AlgorithmicSegmentation.Config.Default();
    AlgorithmicSegmentation segmentation = new AlgorithmicSegmentation(cfg);
    int fingerIndex = 0;
    PrintSegments segments = thumbs.SegmentWith(segmentation);
    for (PrintSegment segment : segments) {
    segment.ToPrint().getImage().SaveAs(
    "output/thumbs_segment_" + fingerIndex + ".png");
    fingerIndex++;
    }
    thumbs.Draw(segments, Shapes.InnoBlue).SaveAs("output/thumbs_segments.png");
  • csharp
    Image img = Image.Decode(BinaryFile.ReadAll("assets/thumbs.png"));
    ThumbsCapture thumbs = ThumbsCapture.Create(img);
    uint fingerIndex = 0;
    AlgorithmicSegmentation.Config cfg = AlgorithmicSegmentation.Config.Default();
    AlgorithmicSegmentation segmentation = new AlgorithmicSegmentation(cfg);
    PrintSegments segments = thumbs.SegmentWith(segmentation);
    foreach (PrintSegment segment in segments)
    {
    segment.ToPrint().image.SaveAs("output/thumbs_segment_" + fingerIndex +
    ".png");
    fingerIndex++;
    }
    thumbs.Draw(segments, Shapes.InnoBlue).SaveAs("output/thumbs_segments.png");

The output of example are segmented thumbs

Segmented Thumbs

and cropped segments

Thumbs Segment 1
Thumbs Segment 2

Prints

We can segment images with one or more fingerprints on it (up to 4 fingerprints). The position of segmented fingerprints are always unknown and user MUST set correct position to be possible to create Print for further processing.

We provides following algorithm for segmentation process:

Print

It can be segmented with function PrintCapture::SegmentWith that return segmented rectangles.

  • c++
    auto img = Image::Decode(BinaryFile::ReadAll("assets/print.png"));
    auto print = PrintCapture::Create(std::move(img));
    NeuralSegmentation segmentation;
    auto segments = print->SegmentWith(segmentation);
    // We know that there is only one finger segmented
    auto segment = segments[0];
    // The segment has no position, we have to set it for
    // further processing
    segment->SetPosition(PrintPosition::LEFT_MIDDLE);
    segment->ToPrint()->image->SaveAs("output/print_nn_segment.png");
    print->Draw(segments, Shapes::InnoBlue)->SaveAs("output/print_nn_segments.png");
  • java
    Image img = Image.Decode(BinaryFile.ReadAll("assets/print.png"));
    PrintCapture print = PrintCapture.Create(img);
    NeuralSegmentation segmentation = new NeuralSegmentation();
    PrintSegments segments = print.SegmentWith(segmentation);
    // We know that there is only one finger segmented
    PrintSegment segment = segments.get(0);
    // The segment has no position, we have to set it for
    // further processing
    segment.SetPosition(PrintPosition.LEFT_MIDDLE);
    segment.ToPrint().getImage().SaveAs("output/print_nn_segment.png");
    print.Draw(segments, Shapes.InnoBlue).SaveAs("output/print_nn_segments.png");
  • csharp
    Image img = Image.Decode(BinaryFile.ReadAll("assets/print.png"));
    PrintCapture print = PrintCapture.Create(img);
    NeuralSegmentation segmentation = new NeuralSegmentation();
    PrintSegments segments = print.SegmentWith(segmentation);
    // We know that there is only one finger segmented
    PrintSegment segment = segments[0];
    // The segment has no position, we have to set it for
    // further processing
    segment.SetPosition(PrintPosition.LEFT_MIDDLE);
    segment.ToPrint().image.SaveAs("output/print_nn_segment.png");
    print.Draw(segments, Shapes.InnoBlue).SaveAs("output/print_nn_segments.png");

The output of example is segmented fingerprint

Segmented Print

and its cropp

Fingerprint Segment

Extraction

The SDK provides following extraction types

ICS Extraction

We provide ICS (Internal Innovatrics template) for Print via ICSExtractor. The main goal is to create template for further processing e.g. 1:1 Verification. During the extraction some intermediate artifacts can be provided.

Note
The adjudicator feature MUST be allowed in license to obtain intermediate artifacts.
  • c++
    auto img = Image::Decode(BinaryFile::ReadAll("assets/finger.png"));
    auto fp = Print::Create(std::move(img), PrintPosition::LEFT_INDEX);
    ICSExtractor::Artifacts artifacts;
    ICSExtractor::SkeletonImage skeleton;
    artifacts.Add(skeleton);
    ICSExtractor::FilteredImage filtered;
    artifacts.Add(filtered);
    ICSExtractor::BinarizedImage binarized;
    artifacts.Add(binarized);
    ICSExtractor extractor;
    auto tmpl = extractor.Extract(fp, artifacts);
    skeleton.GetImage()->SaveAs("output/skeleton.png");
    filtered.GetImage()->SaveAs("output/filtered.png");
    binarized.GetImage()->SaveAs("output/binarized.png");
    BinaryFile::WriteAll("output/fp.ics", tmpl->icsTemplateData);
  • java
    Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    Print fp = new Print(img, PrintPosition.LEFT_INDEX);
    ICSExtractor.Artifacts artifacts = new ICSExtractor.Artifacts();
    ICSExtractor.SkeletonImage skeleton = new ICSExtractor.SkeletonImage();
    artifacts.Add(skeleton);
    ICSExtractor.FilteredImage filtered = new ICSExtractor.FilteredImage();
    artifacts.Add(filtered);
    ICSExtractor.BinarizedImage binarized = new ICSExtractor.BinarizedImage();
    artifacts.Add(binarized);
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint tmpl = extractor.Extract(fp, artifacts);
    skeleton.GetImage().SaveAs("output/skeleton.png");
    filtered.GetImage().SaveAs("output/filtered.png");
    binarized.GetImage().SaveAs("output/binarized.png");
    BinaryFile.WriteAll("output/fp.ics", tmpl.getIcsTemplateData());
  • csharp
    Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    Print fp = new Print(img, PrintPosition.LEFT_INDEX);
    ICSExtractor.Artifacts artifacts = new ICSExtractor.Artifacts();
    ICSExtractor.SkeletonImage skeleton = new ICSExtractor.SkeletonImage();
    artifacts.Add(skeleton);
    ICSExtractor.FilteredImage filtered = new ICSExtractor.FilteredImage();
    artifacts.Add(filtered);
    ICSExtractor.BinarizedImage binarized = new ICSExtractor.BinarizedImage();
    artifacts.Add(binarized);
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint tmpl = extractor.Extract(fp, artifacts);
    skeleton.GetImage().SaveAs("output/skeleton.png");
    filtered.GetImage().SaveAs("output/filtered.png");
    binarized.GetImage().SaveAs("output/binarized.png");
    BinaryFile.WriteAll("output/fp.ics", tmpl.icsTemplateData);

The output of example is template and required intermediate images.

Finger for extraction
Binarized
Filtered
Skeleton

1 to 1 Verification

We provide verification of ICS (Internal Innovatrics template) for Print via ICSVerifyMatcher. The main goal is to calculate Similarity Score for given probe and gallery templates. The examples uses following images:

Probe
Gallery
  • c++
    auto img1 = Image::Decode(BinaryFile::ReadAll("assets/s1_li.png"));
    auto p1 = Print::Create(std::move(img1), PrintPosition::LEFT_INDEX);
    auto img2 = Image::Decode(BinaryFile::ReadAll("assets/s2_li.png"));
    auto p2 = Print::Create(std::move(img2), PrintPosition::LEFT_INDEX);
    ICSExtractor extractor;
    auto tmpl1 = extractor.Extract(p1);
    auto tmpl2 = extractor.Extract(p2);
    const ICSVerifyMatcher matcher(cfg);
    auto score = matcher.Match(*tmpl1, *tmpl2);
    std::cout << " Similarity score == " << score << std::endl;
  • java
    Image img_1 = Image.Decode(BinaryFile.ReadAll("assets/s1_li.png"));
    Print p_1 = Print.Create(img_1, PrintPosition.LEFT_INDEX);
    Image img_2 = Image.Decode(BinaryFile.ReadAll("assets/s2_li.png"));
    Print p_2 = Print.Create(img_2, PrintPosition.LEFT_INDEX);
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint tmpl_1 = extractor.Extract(p_1);
    ExtractedPrint tmpl_2 = extractor.Extract(p_2);
    ICSVerifyMatcher matcher = new ICSVerifyMatcher(ICSVerifyMatcher.Config.Default());
    long score = matcher.Match(tmpl_1, tmpl_2);
    System.out.println(" Similarity score == " + score);
  • csharp
    Image img_1 = Image.Decode(BinaryFile.ReadAll("assets/s1_li.png"));
    Print p_1 = Print.Create(img_1, PrintPosition.LEFT_INDEX);
    Image img_2 = Image.Decode(BinaryFile.ReadAll("assets/s2_li.png"));
    Print p_2 = Print.Create(img_2, PrintPosition.LEFT_INDEX);
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint tmpl_1 = extractor.Extract(p_1);
    ExtractedPrint tmpl_2 = extractor.Extract(p_2);
    ICSVerifyMatcher matcher =
    new ICSVerifyMatcher(ICSVerifyMatcher.Config.Default());
    uint score = matcher.Match(tmpl_1, tmpl_2);
    System.Console.WriteLine(" Similarity score == " + score);

Matching Minutiae

During verification process SDK can provide matching minutiae between verified probe against gallery ICSTemplate. The matching minutia has same index in provided probe and gallery minutiae.

Note
The adjudicator feature MUST be allowed in license to obtain matching minutiae.
  • c++
    auto img1 = Image::Decode(BinaryFile::ReadAll("assets/s1_li.png"));
    auto p1 = Print::Create(std::move(img1), PrintPosition::LEFT_INDEX);
    auto img2 = Image::Decode(BinaryFile::ReadAll("assets/s2_li.png"));
    auto p2 = Print::Create(std::move(img2), PrintPosition::LEFT_INDEX);
    ICSExtractor extractor;
    auto probe = extractor.Extract(p1);
    auto gallery = extractor.Extract(p2);
    auto matchingMinutiae = ICSVerifyMatcher::MatchingMinutiae();
    const ICSVerifyMatcher matcher;
    std::ignore = matcher.Match(*probe, *gallery, matchingMinutiae);
    auto p1Minutiae = probe->print->DrawMinutiae(matchingMinutiae.GetProbeMinutiae(),
    Shapes::InnoBlue);
    auto p2Minutiae = gallery->print->DrawMinutiae(
    matchingMinutiae.GetGalleryMinutiae(), Shapes::InnoBlue);
    p1Minutiae->SaveAs("output/s1_li_minutiae.png");
    p2Minutiae->SaveAs("output/s2_li_minutiae.png");
  • java
    Image img_1 = Image.Decode(BinaryFile.ReadAll("assets/s1_li.png"));
    Print p_1 = Print.Create(img_1, PrintPosition.LEFT_INDEX);
    Image img_2 = Image.Decode(BinaryFile.ReadAll("assets/s2_li.png"));
    Print p_2 = Print.Create(img_2, PrintPosition.LEFT_INDEX);
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint probe = extractor.Extract(p_1);
    ExtractedPrint gallery = extractor.Extract(p_2);
    ICSVerifyMatcher.MatchingMinutiae matchingMinutiae = new ICSVerifyMatcher
    .MatchingMinutiae();
    ICSVerifyMatcher matcher = new ICSVerifyMatcher();
    long score = matcher.Match(probe, gallery, matchingMinutiae);
    Image p_1_minutiae = probe.getPrint().DrawMinutiae(
    matchingMinutiae.GetProbeMinutiae(), Shapes.InnoBlue);
    Image p_2_minutiae = gallery.getPrint().DrawMinutiae(
    matchingMinutiae.GetGalleryMinutiae(), Shapes.InnoBlue);
    p_1_minutiae.SaveAs("output/s1_li_minutiae.png");
    p_2_minutiae.SaveAs("output/s2_li_minutiae.png");
  • csharp
    Image img_1 = Image.Decode(BinaryFile.ReadAll("assets/s1_li.png"));
    Print p_1 = Print.Create(img_1, PrintPosition.LEFT_INDEX);
    Image img_2 = Image.Decode(BinaryFile.ReadAll("assets/s2_li.png"));
    Print p_2 = Print.Create(img_2, PrintPosition.LEFT_INDEX);
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint probe = extractor.Extract(p_1);
    ExtractedPrint gallery = extractor.Extract(p_2);
    ICSVerifyMatcher.MatchingMinutiae matchingMinutiae =
    new ICSVerifyMatcher.MatchingMinutiae();
    ICSVerifyMatcher matcher = new ICSVerifyMatcher();
    uint score = matcher.Match(probe, gallery, matchingMinutiae);
    Image p_1_minutiae = probe.print.DrawMinutiae(matchingMinutiae.GetProbeMinutiae(),
    Shapes.InnoBlue);
    Image p_2_minutiae = gallery.print.DrawMinutiae(
    matchingMinutiae.GetGalleryMinutiae(), Shapes.InnoBlue);
    p_1_minutiae.SaveAs("output/s1_li_minutiae.png");
    p_2_minutiae.SaveAs("output/s2_li_minutiae.png");

Output of example are verified prints with drown matching minutiae.

Probe with matching minutiae
Gallery with matching minutiae

Quality

Qualities provided for a fingerprint image and template:

  • Template quality is calculated from a fingerprint template. The quality is an integer number between 0 (blank image) and 100 (maximum quality). For enrollment, it is recommended to use only templates with quality > 30.

    • c++
      ICSExtractor extractor;
      auto tmpl = extractor.Extract(
      Print::Create(Image::Decode(BinaryFile::ReadAll("assets/finger.png")),
      const uint8_t quality = tmpl->CalculateQuality();
      std::cout << " Template Quality == " << +quality << std::endl;
    • java
      ICSExtractor extractor = new ICSExtractor();
      Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
      ExtractedPrint tmpl = extractor.Extract(
      Print.Create(img, PrintPosition.LEFT_INDEX));
      int quality = tmpl.CalculateQuality();
      System.out.println(" Template Quality == " + quality);
    • csharp
      Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
      ICSExtractor extractor = new ICSExtractor();
      ExtractedPrint tmpl =
      extractor.Extract(Print.Create(img, PrintPosition.LEFT_INDEX));
      var quality = tmpl.CalculateQuality();
      System.Console.WriteLine(" Template Quality == {0}", quality);

  • Presence image quality number is calculated as an area where presence of fingerprint is detected. The calculated value does not measure quality of the presented fingerprint pattern. Presence value is calculated from the fingerprint image. The range is from 0 (lowest quality) to 100 (highest quality).

    • c++
      auto img = Image::Decode(BinaryFile::ReadAll("assets/finger.png"));
      auto fp = Print::Create(std::move(img), PrintPosition::LEFT_INDEX);
      const uint8_t presence = fp->CalculatePresence();
      std::cout << " Presence quality == " << +presence << std::endl;
    • java
      // Read file content via provided File class
      Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
      Print fp = Print.Create(img, PrintPosition.LEFT_INDEX);
      byte presence = fp.CalculatePresence();
      System.out.println(" Presence Quality == " + presence);
    • csharp
      var img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
      var fp = Print.Create(img, PrintPosition.LEFT_INDEX);
      var presence = fp.CalculatePresence();
      System.Console.WriteLine(" Presence Quality == {0}", presence);

  • NFIQ image quality number is calculated in accordance with the general guidelines contained in Section 7.2.5 of ANSI/INCITS 381 standard (Section 8.3.7.3 Quality score of ISO/IEC 19794-4 international standard). Presence value is calculated from the fingerprint image. The range is from 1 (highest quality) to 5 (lowest quality).

    • c++
      auto img = Image::Decode(BinaryFile::ReadAll("assets/finger.png"));
      auto fp = Print::Create(std::move(img), PrintPosition::LEFT_INDEX);
      const uint8_t nfiq1 = fp->CalculateNFIQ1();
      std::cout << " NFIQ quality == " << +nfiq1 << std::endl;
    • java
      Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
      Print fp = Print.Create(img, PrintPosition.LEFT_INDEX);
      byte nfiq1 = fp.CalculateNFIQ1();
      System.out.println(" NFIQ1 Quality == " + nfiq1);
    • csharp
      var img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
      var fp = Print.Create(img, PrintPosition.LEFT_INDEX);
      var nfiq1 = fp.CalculateNFIQ1();
      System.Console.WriteLine(" NFIQ1 Quality == {0}", nfiq1);

  • NFIQ2 image quality number is calculated in accordance with the general guidelines contained in Section 7.2.5 of ANSI/INCITS 381 standard (Section 8.3.7.3 Quality score of ISO/IEC 19794-4 international standard). Presence value is calculated from the fingerprint image. The range is from 0 (lowest quality) to 100 (highest quality).

    • c++
      auto img = Image::Decode(BinaryFile::ReadAll("assets/finger.png"));
      auto fp = Print::Create(std::move(img), PrintPosition::LEFT_INDEX);
      const uint8_t nfiq2 = fp->CalculateNFIQ2();
      std::cout << " NFIQ2 quality == " << +nfiq2 << std::endl;
    • java
      Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
      Print fp = Print.Create(img, PrintPosition.LEFT_INDEX);
      byte nfiq2 = fp.CalculateNFIQ2();
      System.out.println(" NFIQ2 Quality == " + nfiq2);
    • csharp
      var img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
      var fp = Print.Create(img, PrintPosition.LEFT_INDEX);
      var nfiq2 = fp.CalculateNFIQ2();
      System.Console.WriteLine(" NFIQ2 Quality == {0}", nfiq2);

  • Image quality number is calculated in accordance with the general guidelines contained in Section 7.2.5 of ANSI/INCITS 381 standard Section 8.3.7.3 Quality score of ISO/IEC 19794-4 international standard). The range is from 0 (lowest quality) to 100 (highest quality).

    • c++
      auto img = Image::Decode(BinaryFile::ReadAll("assets/finger.png"));
      auto fp = Print::Create(std::move(img), PrintPosition::LEFT_INDEX);
      const uint8_t imageQuality = fp->CalculateImageQuality();
      std::cout << " Image quality == " << +imageQuality << std::endl;
    • java
      Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
      Print fp = Print.Create(img, PrintPosition.LEFT_INDEX);
      byte imageQuality = fp.CalculateImageQuality();
      System.out.println(" Image Quality == " + imageQuality);
    • csharp
      var img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
      var fp = Print.Create(img, PrintPosition.LEFT_INDEX);
      var imageQuality = fp.CalculateImageQuality();
      System.Console.WriteLine(" Image Quality == {0}", imageQuality);

  • Placement The placement score number ranges from 0 to 100 and represents the fitness of the finger placement, evaluated with respect to the detected fingerprint classification (arch, loop, whorl).

    • c++
      auto img = Image::Decode(BinaryFile::ReadAll("assets/finger.png"));
      auto fp = Print::Create(std::move(img), PrintPosition::LEFT_INDEX);
      const uint8_t placement = fp->CalculatePlacement();
      std::cout << " Placement quality == " << +placement << std::endl;
    • java
      Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
      Print fp = Print.Create(img, PrintPosition.LEFT_INDEX);
      byte placement = fp.CalculatePlacement();
      System.out.println(" Placement Quality == " + placement);
    • csharp
      var img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
      var fp = Print.Create(img, PrintPosition.LEFT_INDEX);
      var placement = fp.CalculatePlacement();
      System.Console.WriteLine(" Placement Quality == {0}", placement);

  • Intensity The intensity value is from 0 (lowest intensity, dry finger, low pressure) to 100 (highest intensity, wet finger, high pressure).

    • c++
      auto img = Image::Decode(BinaryFile::ReadAll("assets/finger.png"));
      auto fp = Print::Create(std::move(img), PrintPosition::LEFT_INDEX);
      const uint8_t intensity = fp->CalculateIntensity();
      std::cout << " Image intensity == " << +intensity << std::endl;
    • java
      Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
      Print fp = Print.Create(img, PrintPosition.LEFT_INDEX);
      byte intensity = fp.CalculateIntensity();
      System.out.println(" Intensity Quality == " + intensity);
    • csharp
      var img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
      var fp = Print.Create(img, PrintPosition.LEFT_INDEX);
      var intensity = fp.CalculateIntensity();
      System.Console.WriteLine(" Image intensity == {0}", intensity);

Minutiae

The SDK provides extracted minutiae from ICSTemplate and draw them into Image.

When default minutiae shape does not fit, you can draw own via image functionality.

Note
The adjudicator feature MUST be allowed in license to obtain minutiae from template.
  • c++
    auto img = Image::Decode(BinaryFile::ReadAll("assets/finger.png"));
    auto fp = Print::Create(std::move(img), PrintPosition::LEFT_INDEX);
    ICSExtractor::SkeletonImage skeleton;
    ICSExtractor extractor;
    auto tmpl = extractor.Extract(fp, skeleton);
    auto minutiae = tmpl->GetMinutiae();
    auto skeletonWithMinutiae = skeleton.DrawMinutiae(minutiae, Shapes::InnoBlue);
    skeletonWithMinutiae->SaveAs("output/skeleton_with_minutiae.png");
  • java
    Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    Print fp = new Print(img, PrintPosition.LEFT_INDEX);
    ICSExtractor.SkeletonImage skeleton = new ICSExtractor.SkeletonImage();
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint tmpl = extractor.Extract(fp, skeleton);
    Minutiae minutiae = tmpl.GetMinutiae();
    Image skeletonWithMinutiae = skeleton.DrawMinutiae(minutiae, Shapes.InnoBlue);
    skeletonWithMinutiae.SaveAs("output/skeleton_with_minutiae.png");
  • csharp
    Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    Print fp = new Print(img, PrintPosition.LEFT_INDEX);
    ICSExtractor.SkeletonImage skeleton = new ICSExtractor.SkeletonImage();
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint tmpl = extractor.Extract(fp, skeleton);
    Minutiae minutiae = tmpl.GetMinutiae();
    Image skeletonWithMinutiae = skeleton.DrawMinutiae(minutiae, Shapes.InnoBlue);
    skeletonWithMinutiae.SaveAs("output/skeleton_with_minutiae.png");
Minutiae

Critical Points

The SDK provides extracted core/deltas from ICSTemplate and draw them into Image.

When default critical point shape does not fit, you can draw own via image functionality.

Note
The adjudicator feature MUST be allowed in license to obtain critical points from template.
  • c++
    auto img = Image::Decode(BinaryFile::ReadAll("assets/rolled_print.png"));
    auto fp = Print::Create(std::move(img), PrintPosition::LEFT_INDEX);
    ICSExtractor extractor;
    auto tmpl = extractor.Extract(fp);
    auto points = tmpl->GetCriticalPoints();
    auto printWithPoints = fp->DrawCriticalPoints(points, Shapes::InnoBlue);
    printWithPoints->SaveAs("output/rolled_print_with_critical_points.png");
  • java
    Image img = Image.Decode(BinaryFile.ReadAll("assets/rolled_print.png"));
    Print fp = new Print(img, PrintPosition.LEFT_INDEX);
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint tmpl = extractor.Extract(fp);
    CriticalPoints points = tmpl.GetCriticalPoints();
    Image printWithPoints = fp.DrawCriticalPoints(points, Shapes.InnoBlue);
    printWithPoints.SaveAs("output/rolled_print_with_critical_points.png");
  • csharp
    Image img = Image.Decode(BinaryFile.ReadAll("assets/rolled_print.png"));
    Print fp = new Print(img, PrintPosition.LEFT_INDEX);
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint tmpl = extractor.Extract(fp);
    CriticalPoints points = tmpl.GetCriticalPoints();
    Image printWithPoints = fp.DrawCriticalPoints(points, Shapes.InnoBlue);
    printWithPoints.SaveAs("output/rolled_print_with_critical_points.png");
Critical Points

Template Conversions

ISO Template

It is possible to convert proprietary ICSTemplate to ISOTemplate version 2 with PrintAttributes via function ExtractedPrint::ToISO().

  • c++
    ICSExtractor extractor;
    auto tmpl = extractor.Extract(
    Print::Create(Image::Decode(BinaryFile::ReadAll("assets/finger.png")),
    auto iso = tmpl->ToISO();
    std::cout << "ISO template version: " << iso->GetVersion() << std::endl;
    BinaryFile::WriteAll("output/template.iso", iso->data);
  • java
    Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint tmpl = extractor.Extract(
    Print.Create(img, PrintPosition.LEFT_INDEX));
    ISOTemplate iso = tmpl.ToISO();
    System.out.println("ISO template version: " + iso.GetVersion());
    BinaryFile.WriteAll("output/template.iso", iso.getData());
  • csharp
    Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint tmpl =
    extractor.Extract(Print.Create(img, PrintPosition.LEFT_INDEX));
    ISOTemplate iso = tmpl.ToISO();
    Console.WriteLine("ISO template version: " + iso.GetVersion());
    BinaryFile.WriteAll("output/template.iso", iso.data);

It is possible to convert ICSTemplate / ANSITemplate / ISOTemplate / ISONCTemplate / ISOCCTemplate / ILOSIDTemplate to ISOTemplate version 2/3 via ISOTemplateAdapter. The attributes are copied from adapted template if they are present in adapted template.

  • c++
    ICSExtractor extractor;
    auto extractedPrint = extractor.Extract(
    Print::Create(Image::Decode(BinaryFile::ReadAll("assets/finger.png")),
    const ISOTemplateAdapter adapter(ISOTemplateAdapter::Version::VERSION_3);
    // ICS to ISO v30
    auto fromIcs = adapter.Adapt(*extractedPrint);
    BinaryFile::WriteAll("output/template_from_ics.isov3", fromIcs.data);
    // ANSI to ISO v30
    auto fromAnsi = adapter.Adapt(*extractedPrint->ToANSI());
    BinaryFile::WriteAll("output/template_from_ansi.isov3", fromAnsi.data);
    // ISO to ISO v30
    auto fromIso = adapter.Adapt(*extractedPrint->ToISO());
    BinaryFile::WriteAll("output/template_from_iso.isov3", fromIso.data);
    // ILOSID to ISO v30
    const ILOSIDTemplateAdapter ilosidAdapter;
    auto ilosid = ilosidAdapter.Adapt(*extractedPrint);
    auto fromIlosid = adapter.Adapt(ilosid);
    BinaryFile::WriteAll("output/template_from_ilosid.isov3", fromIlosid.data);
    // ISO CC to ISO
    const ISOCCTemplateAdapter isoccAdapter;
    auto isocc = isoccAdapter.Adapt(*extractedPrint);
    auto fromIsocc = adapter.Adapt(isocc);
    BinaryFile::WriteAll("output/template_from_isocc.isov3", fromIsocc.data);
    // ISO NC to ISO v30
    const ISONCTemplateAdapter isoncAdapter;
    auto isonc = isoncAdapter.Adapt(*extractedPrint);
    auto fromIsonc = adapter.Adapt(isonc);
    BinaryFile::WriteAll("output/template_from_isonc.isov3", fromIsonc.data);
  • java
    Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint extractedPrint = extractor.Extract(
    Print.Create(img, PrintPosition.LEFT_INDEX));
    ISOTemplateAdapter adapter = new ISOTemplateAdapter(
    ISOTemplateAdapter.Version.VERSION_3);
    // ICS to ISO v30
    ISOTemplate fromIcs = adapter.Adapt(extractedPrint);
    BinaryFile.WriteAll("output/template_from_ics.isov3", fromIcs.getData());
    // ANSI to ISO v30
    ISOTemplate fromAnsi = adapter.Adapt(extractedPrint.ToANSI());
    BinaryFile.WriteAll("output/template_from_ansi.isov3", fromAnsi.getData());
    // ISO to ISO v30
    ISOTemplate fromIso = adapter.Adapt(extractedPrint.ToISO());
    BinaryFile.WriteAll("output/template_from_iso.isov3", fromIso.getData());
    // ILOSID to ISO v30
    ILOSIDTemplateAdapter ilosidAdapter = new ILOSIDTemplateAdapter();
    ILOSIDTemplate ilosid = ilosidAdapter.Adapt(extractedPrint);
    ISOTemplate fromIlosid = adapter.Adapt(ilosid);
    BinaryFile.WriteAll("output/template_from_ilosid.isov3", fromIlosid.getData());
    // ISO CC to ISO v30
    ISOCCTemplateAdapter isoccAdapter = new ISOCCTemplateAdapter();
    ISOCCTemplate isocc = isoccAdapter.Adapt(extractedPrint);
    ISOTemplate fromIsocc = adapter.Adapt(isocc);
    BinaryFile.WriteAll("output/template_from_isocc.isov3", fromIsocc.getData());
    // ISO NC to ISO v30
    ISONCTemplateAdapter isoncAdapter = new ISONCTemplateAdapter();
    ISONCTemplate isonc = isoncAdapter.Adapt(extractedPrint);
    ISOTemplate fromIsonc = adapter.Adapt(isonc);
    BinaryFile.WriteAll("output/template_from_isonc.isov3", fromIsonc.getData());
  • csharp
    var img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    var extractor = new ICSExtractor();
    var extractedPrint =
    extractor.Extract(Print.Create(img, PrintPosition.LEFT_INDEX));
    var adapter = new ISOTemplateAdapter(ISOTemplateAdapter.Version.VERSION_3);
    // ICS to ISO v30
    var fromIcs = adapter.Adapt(extractedPrint);
    BinaryFile.WriteAll("output/template_from_ics.isov3", fromIcs.data);
    // ANSI to ISO v30
    var fromAnsi = adapter.Adapt(extractedPrint.ToANSI());
    BinaryFile.WriteAll("output/template_from_ansi.isov3", fromAnsi.data);
    // ISO to ISO v30
    var fromIso = adapter.Adapt(extractedPrint.ToISO());
    BinaryFile.WriteAll("output/template_from_iso.isov3", fromIso.data);
    // ILOSID to ISO v30
    var ilosidAdapter = new ILOSIDTemplateAdapter();
    var ilosid = ilosidAdapter.Adapt(extractedPrint);
    var fromIlosid = adapter.Adapt(ilosid);
    BinaryFile.WriteAll("output/template_from_ilosid.isov3", fromIlosid.data);
    // ISO CC to ISO v30
    var isoccAdapter = new ISOCCTemplateAdapter();
    var isocc = isoccAdapter.Adapt(extractedPrint);
    var fromIsocc = adapter.Adapt(isocc);
    BinaryFile.WriteAll("output/template_from_isocc.isov3", fromIsocc.data);
    // ISO NC to ISO v30
    var isoncAdapter = new ISONCTemplateAdapter();
    var isonc = isoncAdapter.Adapt(extractedPrint);
    var fromIsonc = adapter.Adapt(isonc);
    BinaryFile.WriteAll("output/template_from_isonc.isov3", fromIsonc.data);

ISO Image

It is possible to convert Print to ISO image compliant with ISO 19794-4:2011 and back from image to Print.

ANSI Template

It is possible to convert proprietary ICSTemplate to ANSITemplate with PrintAttributes via function ExtractedPrint::ToANSI().

  • c++
    ICSExtractor extractor;
    auto tmpl = extractor.Extract(
    Print::Create(Image::Decode(BinaryFile::ReadAll("assets/finger.png")),
    auto ansi = tmpl->ToANSI();
    std::cout << "ANSI template version: " << ansi->GetVersion() << std::endl;
    BinaryFile::WriteAll("output/template.ansi", ansi->data);
  • java
    Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint tmpl = extractor.Extract(
    Print.Create(img, PrintPosition.LEFT_INDEX));
    ANSITemplate ansi = tmpl.ToANSI();
    System.out.println("ANSI template version: " + ansi.GetVersion());
    BinaryFile.WriteAll("output/template.ansi", ansi.getData());
  • csharp
    Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint tmpl =
    extractor.Extract(Print.Create(img, PrintPosition.LEFT_INDEX));
    ANSITemplate ansi = tmpl.ToANSI();
    Console.WriteLine("ANSI template version: " + ansi.GetVersion());
    BinaryFile.WriteAll("output/template.ansi", ansi.data);

It is possible to convert ICSTemplate / ISOTemplate / ISONCTemplate / ISOCCTemplate / ILOSIDTemplate to ANSITemplate via ANSITemplateAdapter. The attributes are copied from adapted template if they are present in adapted template.

  • c++
    ICSExtractor extractor;
    auto extractedPrint = extractor.Extract(
    Print::Create(Image::Decode(BinaryFile::ReadAll("assets/finger.png")),
    const ANSITemplateAdapter adapter;
    // ICS to ANSI
    auto fromIcs = adapter.Adapt(*extractedPrint);
    BinaryFile::WriteAll("output/template_from_ics.ansi", fromIcs.data);
    // ISO to ANSI
    auto fromIso = adapter.Adapt(*extractedPrint->ToISO());
    BinaryFile::WriteAll("output/template_from_iso.ansi", fromIso.data);
    // ILOSID to ANSI
    const ILOSIDTemplateAdapter ilosidAdapter;
    auto ilosid = ilosidAdapter.Adapt(*extractedPrint);
    auto fromIlosid = adapter.Adapt(ilosid);
    BinaryFile::WriteAll("output/template_from_ilosid.ansi", fromIlosid.data);
    // ISO CC to ANSI
    const ISOCCTemplateAdapter isoccAdapter;
    auto isocc = isoccAdapter.Adapt(*extractedPrint);
    auto fromIsocc = adapter.Adapt(isocc);
    BinaryFile::WriteAll("output/template_from_isocc.ansi", fromIsocc.data);
    // ISO NC to ANSI
    const ISONCTemplateAdapter isoncAdapter;
    auto isonc = isoncAdapter.Adapt(*extractedPrint);
    auto fromIsonc = adapter.Adapt(isonc);
    BinaryFile::WriteAll("output/template_from_isonc.ansi", fromIsonc.data);
  • java
    Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint extractedPrint = extractor.Extract(
    Print.Create(img, PrintPosition.LEFT_INDEX));
    ANSITemplateAdapter adapter = new ANSITemplateAdapter();
    // ICS to ANSI
    ANSITemplate fromIcs = adapter.Adapt(extractedPrint);
    BinaryFile.WriteAll("output/template_from_ics.ansi", fromIcs.getData());
    // ISO to ANSI
    ANSITemplate fromIso = adapter.Adapt(extractedPrint.ToISO());
    BinaryFile.WriteAll("output/template_from_iso.ansi", fromIso.getData());
    // ILOSID to ANSI
    ILOSIDTemplateAdapter ilosidAdapter = new ILOSIDTemplateAdapter();
    ILOSIDTemplate ilosid = ilosidAdapter.Adapt(extractedPrint);
    ANSITemplate fromIlosid = adapter.Adapt(ilosid);
    BinaryFile.WriteAll("output/template_from_ilosid.ansi", fromIlosid.getData());
    // ISO CC to ANSI
    ISOCCTemplateAdapter isoccAdapter = new ISOCCTemplateAdapter();
    ISOCCTemplate isocc = isoccAdapter.Adapt(extractedPrint);
    ANSITemplate fromIsocc = adapter.Adapt(isocc);
    BinaryFile.WriteAll("output/template_from_isocc.ansi", fromIsocc.getData());
    // ISO NC to ANSI
    ISONCTemplateAdapter isoncAdapter = new ISONCTemplateAdapter();
    ISONCTemplate isonc = isoncAdapter.Adapt(extractedPrint);
    ANSITemplate fromIsonc = adapter.Adapt(isonc);
    BinaryFile.WriteAll("output/template_from_isonc.ansi", fromIsonc.getData());
  • csharp
    var img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    var extractor = new ICSExtractor();
    var extractedPrint =
    extractor.Extract(Print.Create(img, PrintPosition.LEFT_INDEX));
    var adapter = new ANSITemplateAdapter();
    // ICS to ANSI
    var fromIcs = adapter.Adapt(extractedPrint);
    BinaryFile.WriteAll("output/template_from_ics.ansi", fromIcs.data);
    // ISO to ANSI
    var fromIso = adapter.Adapt(extractedPrint.ToISO());
    BinaryFile.WriteAll("output/template_from_iso.ansi", fromIso.data);
    // ILOSID to ANSI
    var ilosidAdapter = new ILOSIDTemplateAdapter();
    var ilosid = ilosidAdapter.Adapt(extractedPrint);
    var fromIlosid = adapter.Adapt(ilosid);
    BinaryFile.WriteAll("output/template_from_ilosid.ansi", fromIlosid.data);
    // ISO CC to ANSI
    var isoccAdapter = new ISOCCTemplateAdapter();
    var isocc = isoccAdapter.Adapt(extractedPrint);
    var fromIsocc = adapter.Adapt(isocc);
    BinaryFile.WriteAll("output/template_from_isocc.ansi", fromIsocc.data);
    // ISO NC to ANSI
    var isoncAdapter = new ISONCTemplateAdapter();
    var isonc = isoncAdapter.Adapt(extractedPrint);
    var fromIsonc = adapter.Adapt(isonc);
    BinaryFile.WriteAll("output/template_from_isonc.ansi", fromIsonc.data);

ILO SID Template

International Labour Organisation Seafarers Identity Document template.

It is possible to convert ICSTemplate / ANSITemplate / ISOTemplate / ISONCTemplate / ISOCCTemplate to ILOSIDTemplate via ILOSIDTemplateAdapter.

  • c++
    ICSExtractor extractor;
    auto extractedPrint = extractor.Extract(
    Print::Create(Image::Decode(BinaryFile::ReadAll("assets/finger.png")),
    const ILOSIDTemplateAdapter adapter;
    // ICS to ILO SID
    auto fromIcs = adapter.Adapt(*extractedPrint);
    BinaryFile::WriteAll("output/template_from_ics.ilosid", fromIcs.GetData());
    // ANSI to ILO SID
    auto fromAnsi = adapter.Adapt(*extractedPrint->ToANSI());
    BinaryFile::WriteAll("output/template_from_ansi.ilosid", fromAnsi.GetData());
    // ISO to ILO SID
    auto fromIso = adapter.Adapt(*extractedPrint->ToISO());
    BinaryFile::WriteAll("output/template_from_iso.ilosid", fromIso.GetData());
    // ISO NC to ILO SID
    const ISONCTemplateAdapter isoncAdapter;
    auto isonc = isoncAdapter.Adapt(*extractedPrint);
    auto fromIsonc = adapter.Adapt(isonc);
    BinaryFile::WriteAll("output/template_from_isonc.ilosid", fromIsonc.GetData());
    // ISO CC to ILO SID
    const ISOCCTemplateAdapter isoccAdapter;
    auto isocc = isoccAdapter.Adapt(*extractedPrint);
    auto fromIsocc = adapter.Adapt(isocc);
    BinaryFile::WriteAll("output/template_from_isocc.ilosid", fromIsocc.GetData());
  • java
    Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint extractedPrint = extractor.Extract(
    Print.Create(img, PrintPosition.LEFT_INDEX));
    ILOSIDTemplateAdapter adapter = new ILOSIDTemplateAdapter();
    // ICS to ILO SID
    ILOSIDTemplate fromIcs = adapter.Adapt(extractedPrint);
    BinaryFile.WriteAll("output/template_from_ics.ilosid", fromIcs.GetData());
    // ANSI to ILO SID
    ILOSIDTemplate fromAnsi = adapter.Adapt(extractedPrint.ToANSI());
    BinaryFile.WriteAll("output/template_from_ansi.ilosid", fromAnsi.GetData());
    // ISO to ILO SID
    ILOSIDTemplate fromIso = adapter.Adapt(extractedPrint.ToISO());
    BinaryFile.WriteAll("output/template_from_iso.ilosid", fromIso.GetData());
    // ISO NC to ILO SID
    ISONCTemplateAdapter isoncAdapter = new ISONCTemplateAdapter();
    ISONCTemplate isonc = isoncAdapter.Adapt(extractedPrint);
    ILOSIDTemplate fromIlosid = adapter.Adapt(isonc);
    BinaryFile.WriteAll("output/template_from_isonc.ilosid", fromIlosid.GetData());
    // ISO CC to ILOSID
    ISOCCTemplateAdapter isoccAdapter = new ISOCCTemplateAdapter();
    ISOCCTemplate isocc = isoccAdapter.Adapt(extractedPrint);
    ILOSIDTemplate fromIsocc = adapter.Adapt(isocc);
    BinaryFile.WriteAll("output/template_from_isocc.ilosid", fromIsocc.GetData());
  • csharp
    var img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    var extractor = new ICSExtractor();
    var extractedPrint =
    extractor.Extract(Print.Create(img, PrintPosition.LEFT_INDEX));
    var adapter = new ILOSIDTemplateAdapter();
    // ICS to ILO SID
    var fromIcs = adapter.Adapt(extractedPrint);
    BinaryFile.WriteAll("output/template_from_ics.ilosid", fromIcs.GetData());
    // ANSI to ILO SID
    var fromAnsi = adapter.Adapt(extractedPrint.ToANSI());
    BinaryFile.WriteAll("output/template_from_ansi.ilosid", fromAnsi.GetData());
    // ISO to ILO SID
    var fromIso = adapter.Adapt(extractedPrint.ToISO());
    BinaryFile.WriteAll("output/template_from_iso.ilosid", fromIso.GetData());
    // ISO NC to ILO SID
    var isoncAdapter = new ISONCTemplateAdapter();
    var isonc = isoncAdapter.Adapt(extractedPrint);
    var fromIsonc = adapter.Adapt(isonc);
    BinaryFile.WriteAll("output/template_from_isonc.ilosid", fromIsonc.GetData());
    // ISO CC to ILO SID
    var isoccAdapter = new ISOCCTemplateAdapter();
    var isocc = isoccAdapter.Adapt(extractedPrint);
    var fromIsocc = adapter.Adapt(isocc);
    BinaryFile.WriteAll("output/template_from_isocc.ilosid", fromIsocc.GetData());

ISO NC Template

ISO/IEC 19794-2:2005 template, template version 2.0, 5-byte format for minutiae (normal card encoding).

It is possible to convert ICSTemplate / ANSITemplate / ISOTemplate / ILOSIDTemplate / ISOCCTemplate to ISONCTemplate via ISONCTemplateAdapter.

  • c++
    ICSExtractor extractor;
    auto extractedPrint = extractor.Extract(
    Print::Create(Image::Decode(BinaryFile::ReadAll("assets/finger.png")),
    const ISONCTemplateAdapter adapter;
    // ICS to ISO NC
    auto fromIcs = adapter.Adapt(*extractedPrint);
    BinaryFile::WriteAll("output/template_from_ics.isonc", fromIcs.GetData());
    // ANSI to ISO NC
    auto fromAnsi = adapter.Adapt(*extractedPrint->ToANSI());
    BinaryFile::WriteAll("output/template_from_ansi.isonc", fromAnsi.GetData());
    // ISO to ISO NC
    auto fromIso = adapter.Adapt(*extractedPrint->ToISO());
    BinaryFile::WriteAll("output/template_from_iso.isonc", fromIso.GetData());
    // ILOSID to ISO NC
    const ILOSIDTemplateAdapter ilosidAdapter;
    auto ilosid = ilosidAdapter.Adapt(*extractedPrint);
    auto fromIlosid = adapter.Adapt(ilosid);
    BinaryFile::WriteAll("output/template_from_ilosid.isonc", fromIlosid.GetData());
    // ISO CC to ISO NC
    const ISOCCTemplateAdapter isoccAdapter;
    auto isocc = isoccAdapter.Adapt(*extractedPrint);
    auto fromIsocc = adapter.Adapt(isocc);
    BinaryFile::WriteAll("output/template_from_isocc.isonc", fromIsocc.GetData());
  • java
    Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint extractedPrint = extractor.Extract(
    Print.Create(img, PrintPosition.LEFT_INDEX));
    ISONCTemplateAdapter adapter = new ISONCTemplateAdapter();
    // ICS to ISO NC
    ISONCTemplate fromIcs = adapter.Adapt(extractedPrint);
    BinaryFile.WriteAll("output/template_from_ics.isonc", fromIcs.GetData());
    // ANSI to ISO NC
    ISONCTemplate fromAnsi = adapter.Adapt(extractedPrint.ToANSI());
    BinaryFile.WriteAll("output/template_from_ansi.isonc", fromAnsi.GetData());
    // ISO to ISO NC
    ISONCTemplate fromIso = adapter.Adapt(extractedPrint.ToISO());
    BinaryFile.WriteAll("output/template_from_iso.isonc", fromIso.GetData());
    // ILOSID to ISO NC
    ILOSIDTemplateAdapter ilosidAdapter = new ILOSIDTemplateAdapter();
    ILOSIDTemplate ilosid = ilosidAdapter.Adapt(extractedPrint);
    ISONCTemplate fromIlosid = adapter.Adapt(ilosid);
    BinaryFile.WriteAll("output/template_from_ilosid.isonc", fromIlosid.GetData());
    // ISO CC to ISO NC
    ISOCCTemplateAdapter isoccAdapter = new ISOCCTemplateAdapter();
    ISOCCTemplate isocc = isoccAdapter.Adapt(extractedPrint);
    ISONCTemplate fromIsocc = adapter.Adapt(isocc);
    BinaryFile.WriteAll("output/template_from_isocc.isonc", fromIsocc.GetData());
  • csharp
    var img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    var extractor = new ICSExtractor();
    var extractedPrint =
    extractor.Extract(Print.Create(img, PrintPosition.LEFT_INDEX));
    var adapter = new ISONCTemplateAdapter();
    // ICS to ISO NC
    var fromIcs = adapter.Adapt(extractedPrint);
    BinaryFile.WriteAll("output/template_from_ics.isonc", fromIcs.GetData());
    // ANSI to ISO NC
    var fromAnsi = adapter.Adapt(extractedPrint.ToANSI());
    BinaryFile.WriteAll("output/template_from_ansi.isonc", fromAnsi.GetData());
    // ISO to ISO NC
    var fromIso = adapter.Adapt(extractedPrint.ToISO());
    BinaryFile.WriteAll("output/template_from_iso.isonc", fromIso.GetData());
    // ILOSID to ISO NC
    var ilosidAdapter = new ILOSIDTemplateAdapter();
    var ilosid = ilosidAdapter.Adapt(extractedPrint);
    var fromIlosid = adapter.Adapt(ilosid);
    BinaryFile.WriteAll("output/template_from_ilosid.isonc", fromIlosid.GetData());
    // ISO CC to ISO NC
    var isoccAdapter = new ISOCCTemplateAdapter();
    var isocc = isoccAdapter.Adapt(extractedPrint);
    var fromIsocc = adapter.Adapt(isocc);
    BinaryFile.WriteAll("output/template_from_isocc.isonc", fromIsocc.GetData());

ISO CC Template

ISO/IEC 19794-2:2005 template, template version 2.0, 3-byte format for minutiae (compact card encoding).

It is possible to convert ICSTemplate / ANSITemplate / ISOTemplate / ILOSIDTemplate / ISONCTemplate to ISOCCTemplate via ISOCCTemplateAdapter.

  • c++
    ICSExtractor extractor;
    auto extractedPrint = extractor.Extract(
    Print::Create(Image::Decode(BinaryFile::ReadAll("assets/finger.png")),
    const ISOCCTemplateAdapter adapter;
    // ICS to ISO CC
    auto fromIcs = adapter.Adapt(*extractedPrint);
    BinaryFile::WriteAll("output/template_from_ics.isocc", fromIcs.GetData());
    // ANSI to ISO CC
    auto fromAnsi = adapter.Adapt(*extractedPrint->ToANSI());
    BinaryFile::WriteAll("output/template_from_ansi.isocc", fromAnsi.GetData());
    // ISO to ISO CC
    auto fromIso = adapter.Adapt(*extractedPrint->ToISO());
    BinaryFile::WriteAll("output/template_from_iso.isocc", fromIso.GetData());
    // ILOSID to ISO CC
    const ILOSIDTemplateAdapter ilosidAdapter;
    auto ilosid = ilosidAdapter.Adapt(*extractedPrint);
    auto fromIlosid = adapter.Adapt(ilosid);
    BinaryFile::WriteAll("output/template_from_ilosid.isocc", fromIlosid.GetData());
    // ISO NC to ISO CC
    const ISONCTemplateAdapter isoncAdapter;
    auto isonc = isoncAdapter.Adapt(*extractedPrint);
    auto fromIsonc = adapter.Adapt(isonc);
    BinaryFile::WriteAll("output/template_from_isonc.isocc", fromIsonc.GetData());
  • java
    Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint extractedPrint = extractor.Extract(
    Print.Create(img, PrintPosition.LEFT_INDEX));
    ISOCCTemplateAdapter adapter = new ISOCCTemplateAdapter();
    // ICS to ISO CC
    ISOCCTemplate fromIcs = adapter.Adapt(extractedPrint);
    BinaryFile.WriteAll("output/template_from_ics.isocc", fromIcs.GetData());
    // ANSI to ISO CC
    ISOCCTemplate fromAnsi = adapter.Adapt(extractedPrint.ToANSI());
    BinaryFile.WriteAll("output/template_from_ansi.isocc", fromAnsi.GetData());
    // ISO to ISO CC
    ISOCCTemplate fromIso = adapter.Adapt(extractedPrint.ToISO());
    BinaryFile.WriteAll("output/template_from_iso.isocc", fromIso.GetData());
    // ILOSID to ISO CC
    ILOSIDTemplateAdapter ilosidAdapter = new ILOSIDTemplateAdapter();
    ILOSIDTemplate ilosid = ilosidAdapter.Adapt(extractedPrint);
    ISOCCTemplate fromIlosid = adapter.Adapt(ilosid);
    BinaryFile.WriteAll("output/template_from_ilosid.isocc", fromIlosid.GetData());
    // ISO NC to ISO CC
    ISONCTemplateAdapter isoncAdapter = new ISONCTemplateAdapter();
    ISONCTemplate isonc = isoncAdapter.Adapt(extractedPrint);
    ISOCCTemplate fromIsonc = adapter.Adapt(isonc);
    BinaryFile.WriteAll("output/template_from_isonc.isocc", fromIsonc.GetData());
  • csharp
    var img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    var extractor = new ICSExtractor();
    var extractedPrint =
    extractor.Extract(Print.Create(img, PrintPosition.LEFT_INDEX));
    var adapter = new ISOCCTemplateAdapter();
    // ICS to ISO CC
    var fromIcs = adapter.Adapt(extractedPrint);
    BinaryFile.WriteAll("output/template_from_ics.isocc", fromIcs.GetData());
    // ANSI to ISO CC
    var fromAnsi = adapter.Adapt(extractedPrint.ToANSI());
    BinaryFile.WriteAll("output/template_from_ansi.isocc", fromAnsi.GetData());
    // ISO to ISO CC
    var fromIso = adapter.Adapt(extractedPrint.ToISO());
    BinaryFile.WriteAll("output/template_from_iso.isocc", fromIso.GetData());
    // ILOSID to ISO CC
    var ilosidAdapter = new ILOSIDTemplateAdapter();
    var ilosid = ilosidAdapter.Adapt(extractedPrint);
    var fromIlosid = adapter.Adapt(ilosid);
    BinaryFile.WriteAll("output/template_from_ilosid.isocc", fromIlosid.GetData());
    // ISO NC to ISO CC
    var isoncAdapter = new ISONCTemplateAdapter();
    var isonc = isoncAdapter.Adapt(extractedPrint);
    var fromIsonc = adapter.Adapt(isonc);
    BinaryFile.WriteAll("output/template_from_isonc.isocc", fromIsonc.GetData());

It is possible to limit and modify minutiae order in ISOCCTemplate.

  • c++
    ICSExtractor extractor;
    auto extractedPrint = extractor.Extract(
    Print::Create(Image::Decode(BinaryFile::ReadAll("assets/finger.png")),
    const ISOCCTemplateAdapter adapter(5,
    // ICS to Limited ISO CC
    auto fromIcs = adapter.Adapt(*extractedPrint);
    BinaryFile::WriteAll("output/template_from_ics.limited_isocc", fromIcs.GetData());
  • java
    Image img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    ICSExtractor extractor = new ICSExtractor();
    ExtractedPrint extractedPrint = extractor.Extract(
    Print.Create(img, PrintPosition.LEFT_INDEX));
    ISOCCTemplateAdapter adapter = new ISOCCTemplateAdapter(5,
    ISOCCTemplateAdapter.MinutiaSortOrder.X_ASC,
    ISOCCTemplateAdapter.MinutiaSortOrder.NONE);
    // ICS to Limited ISO CC
    ISOCCTemplate fromIcs = adapter.Adapt(extractedPrint);
    BinaryFile.WriteAll("output/template_from_ics.limited_isocc", fromIcs.GetData());
  • csharp
    var img = Image.Decode(BinaryFile.ReadAll("assets/finger.png"));
    var extractor = new ICSExtractor();
    var extractedPrint =
    extractor.Extract(Print.Create(img, PrintPosition.LEFT_INDEX));
    var adapter =
    new ISOCCTemplateAdapter(5, ISOCCTemplateAdapter.MinutiaSortOrder.X_ASC,
    ISOCCTemplateAdapter.MinutiaSortOrder.NONE);
    // ICS to Limited ISO CC
    var fromIcs = adapter.Adapt(extractedPrint);
    BinaryFile.WriteAll("output/template_from_ics.limited_isocc", fromIcs.GetData());

Load template

It is possible to load previously created template to make e.g. verification against enrolling Applicant.

  • c++
    auto tmpl = ICSTemplate(BinaryFile::ReadAll("assets/template.ics"));
    std::cout << " ICS template version: " << tmpl.GetVersion() << std::endl;
    // Template was exported from IDKit with function IEngine_ExportUserTemplate with
    // FORMAT_ICS and contains only one fingerprint
    auto tmplFromIDkit =
    ICSTemplate(BinaryFile::ReadAll("assets/idkit_template.ics"));
    std::cout << " IDKit ICS template version: " << tmplFromIDkit.GetVersion()
    << std::endl;
  • java
    ICSTemplate tmpl = new ICSTemplate(BinaryFile.ReadAll("assets/template.ics"));
    System.out.println(" ICS template version: " + tmpl.GetVersion());
    // Template was exported from IDKit with function IEngine_ExportUserTemplate with
    // FORMAT_ICS and contains only one fingerprint
    ICSTemplate tmplFromIDkit = new ICSTemplate(
    BinaryFile.ReadAll("assets/idkit_template.ics"));
    System.out.println(" IDKit ICS template version: " + tmplFromIDkit.GetVersion());
  • csharp
    ICSTemplate tmpl = new ICSTemplate(BinaryFile.ReadAll("assets/template.ics"));
    Console.WriteLine(" ICS template version: " + tmpl.GetVersion());
    // Template was exported from IDKit with function IEngine_ExportUserTemplate with
    // FORMAT_ICS and contains only one fingerprint
    ICSTemplate tmplFromIDkit =
    new ICSTemplate(BinaryFile.ReadAll("assets/idkit_template.ics"));
    Console.WriteLine(" IDKit ICS template version: " + tmplFromIDkit.GetVersion());

Typedef Documentation

◆ PrintSimilarityScore

using PrintSimilarityScore = unsigned int

It is similarity score between print Templates.

Score is 0-1000 where 1000 represents most similar templates.

The correspondence between print templates is generally reflected by similarity scores greater than default similarity threshold (40). For more information please refer to FAR and Threshold (see False Acceptance Rate). Default similarity threshold value (40) roughly corresponds to FAR=10^-4. Depending on the type of scanner, the size of print images, the size of the database and the desired security level of your application, you may need to select a different threshold.

See Similarity Score.

Enumeration Type Documentation

◆ PrintCaptureDeviceTechnology

enum class PrintCaptureDeviceTechnology : uint8_t
strong

It shall indicate the class of capture device technology used to acquire the captured biometric sample [5].

Enumerator
UNKNOWN 

Unknown or unspecified.

WHITE_LIGHT_OPTICAL_TIR 

White light optical TIR.

WHITE_LIGHT_OPTICAL_DIRECT 

White light optical direct view on platen.

Card scanner should encode their technology type as white light optical direct view on platen.

WHITE_LIGHT_OPTICAL_TOUCHLESS 

White light optical touchless.

MONOCHROMATIC_VISIBLE_OPTICAL_TIR 

Monochromatic visible optical TIR.

MONOCHROMATIC_VISIBLE_OPTICAL_DIRECT 

Monochromatic visible optical direct view on platen.

MONOCHROMATIC_VISIBLE_OPTICAL_TOUCHLESS 

Monochromatic visible optical touchless.

MONOCHROMATIC_VISIBLE_IR_OPTICAL_TIR 

Monochromatic IR optical TIR.

MONOCHROMATIC_VISIBLE_IR_OPTICALTOUCHLESS 

Monochromatic IR optical direct view on platen.

MONOCHROMATIC_VISIBLE_IR_OPTICAL 

Monochromatic IR optical touchless.

MULTISPECTRAL_OPTICAL_TIR 

Multispectral optical TIR.

MULTISPECTRAL_OPTICAL_DIRECT 

Multispectral optical direct view on platen.

MULTISPECTRAL_OPTICAL_TOUCHLESS 

Multispectral optical touchless.

ELECTRO_LUMINESCENT 

Electro luminescent.

SEMICONDUCTOR_CAPACITIVE 

Semiconductor capacitive.

SEMICONDUCTOR_RF 

Semiconductor RF.

SEMICONDUCTOR_THERMAL 

Semiconductor thermal.

PRESSURE_SENSITIVE 

Pressure sensitive.

ULTRASOUND 

Ultrasound.

MECHANICAL 

Mechanical.

GLASS_FIBER 

Glass fiber.

◆ PrintImpression

enum class PrintImpression : uint8_t
strong

It is impression of prints [5].

Depending on the acquisition methodology, fingerprints can be classified in three types:

  • rolled
  • plain
  • latent
Rolled
A fingerprint image collected by rolling the finger across a livescan platen or paper fingerprint card from nail to nail. Rolls may be from livescan devices or scanned from paper fingerprint cards
Plain
A fingerprint image resulting from the touching of one or more fingers to a livescan platen or paper fingerprint card without any rolling motion
Latent
An impression or image of friction ridge skin left on a surface. Latent impressions are only partial fingerprints and normally have poor quality and strong distortions
Nonlive
Nonlive entries refer to images scanned from cards or other media.
Live-scan
Live-scan contactless refers to image capture devices that do not depend upon the surface of a finger making contact with a scanner platen.
Enumerator
LIVE_SCAN_PLAIN 

Live-scan plain.

LIVE_SCAN_ROLLED 

Live-scan rolled.

NONLIVE_SCAN_PLAIN 

Nonlive-scan plain.

NONLIVE_SCAN_ROLLED 

Nonlive-scan rolled.

LATENT_IMPRESSION 

Latent impression.

LATENT_TRACING 

Latent tracing.

LATENT_PHOTO 

Latent photo.

LATENT_LIFT 

Latent lift.

LIVE_SCAN_SWIPE 

Live-scan swipe.

LIVE_SCAN_VERTICAL_ROLL 

Live-scan vertical roll.

LIVE_SCAN_PALM 

Live-scan palm.

NONLIVE_SCAN_PALM 

Nonlive-scan palm.

LATENT_PALM_IMPRESSION 

Latent palm impression.

LATENT_PALM_TRACING 

Latent palm tracing.

LATENT_PALM_PHOTO 

Latent palm photo.

LATENT_PALM_LIFT 

Latent palm lift.

LIVE_SCAN_OPTICAL_CONCTACTLESS_PLAIN 

Live-scan optical contactless plain.

OTHER 

Other.

UNKNOWN 

Unknown.

◆ PrintPosition

enum class PrintPosition : uint8_t
strong

It is position of finger on hands.

The library supports conversion to and from ISO positions [5].

  • c++
    auto printPosition = IsoToPrintPosition(isoPosition);
    std::cout << " Print to ISO position " << PrintPosition::LEFT_FULL_PALM
    << " -> " << isoPosition << std::endl;
    std::cout << " ISO to print position " << isoPosition << " -> " << printPosition
    << std::endl;
  • java
    int isoPosition = enrollment.PrintToIsoPosition(PrintPosition.LEFT_FULL_PALM);
    PrintPosition printPosition = enrollment.IsoToPrintPosition(isoPosition);
    System.out.println(" Print to ISO position " + PrintPosition.LEFT_FULL_PALM
    + " -> " + isoPosition);
    System.out.println(" ISO to print position " + isoPosition + " -> "
    + printPosition);
  • csharp
    var isoPosition = enrollment.PrintToIsoPosition(PrintPosition.LEFT_FULL_PALM);
    var printPosition = enrollment.IsoToPrintPosition(isoPosition);
    System.Console.WriteLine(" Print to ISO position " +
    PrintPosition.LEFT_FULL_PALM + " -> " + isoPosition);
    System.Console.WriteLine(" ISO to print position " + isoPosition + " -> " +
    printPosition);
Enumerator
RIGHT_THUMB 

Thumb on right hand.

Right Thumb position
RIGHT_INDEX 

Index on right hand.

Right Index position
RIGHT_MIDDLE 

Middle on right hand.

Right Middle position
RIGHT_RING 

Ring on right hand.

Right Ring position
RIGHT_LITTLE 

Little on right hand.

Right Little position
LEFT_THUMB 

Thumb on left hand.

Left Thumb position
LEFT_INDEX 

Index on left hand.

Left Index position
LEFT_MIDDLE 

Middle on left hand.

Left Middle position
LEFT_RING 

Ring on left hand.

Left Ring position
LEFT_LITTLE 

Little finger on left hand.

Left Little position
RIGHT_FULL_PALM 

Right full palm.

Right Full Palm position
RIGHT_WRITERS_PALM 

Right writer palm.

Right Writer Palm position
LEFT_FULL_PALM 

Left full palm.

Left Full Palm position
LEFT_WRITERS_PALM 

Left writer palm.

Left Writer Palm position
RIGHT_LOWER_PALM 

Right lower palm.

Right Lower Palm position
RIGHT_UPPER_PALM 

Right upper palm.

Right Upper Palm position
LEFT_LOWER_PALM 

Left lower palm.

Left Lower Palm position
LEFT_UPPER_PALM 

Left upper palm.

Left Upper Palm position
RIGHT_INTERDIGITAL 

Right interdigital palm.

Right Interdigital Palm position
RIGHT_THENAR 

Right thenar palm.

Right Thenar Palm position
RIGHT_HYPOTHENAR 

Right hypo thenar palm.

Right Hypo-Thenar Palm position
LEFT_INTERDIGITAL 

Left interdigital palm.

Left Interdigital Palm position
LEFT_THENAR 

Left thenar palm.

Left Thenar Palm position
LEFT_HYPOTHENAR 

Left hypo thenar palm.

Left Hypo-Thenar Palm position

Function Documentation

◆ IsoToPrintCaptureDeviceTechnology()

constexpr PrintCaptureDeviceTechnology IsoToPrintCaptureDeviceTechnology ( int isoCaptureDeviceTechnology)
staticconstexpr

Function converts ISO capture technology to PrintCaptureDeviceTechnology.

Parameters
isoCaptureDeviceTechnologyiso capture technology
Exceptions
EnrollmentInvalidArgumentExceptionfor invalid conversion
Returns
PrintCaptureDeviceTechnology

References ELECTRO_LUMINESCENT, GLASS_FIBER, MECHANICAL, MONOCHROMATIC_VISIBLE_IR_OPTICAL, MONOCHROMATIC_VISIBLE_IR_OPTICAL_TIR, MONOCHROMATIC_VISIBLE_IR_OPTICALTOUCHLESS, MONOCHROMATIC_VISIBLE_OPTICAL_DIRECT, MONOCHROMATIC_VISIBLE_OPTICAL_TIR, MONOCHROMATIC_VISIBLE_OPTICAL_TOUCHLESS, MULTISPECTRAL_OPTICAL_DIRECT, MULTISPECTRAL_OPTICAL_TIR, MULTISPECTRAL_OPTICAL_TOUCHLESS, PRESSURE_SENSITIVE, SEMICONDUCTOR_CAPACITIVE, SEMICONDUCTOR_RF, SEMICONDUCTOR_THERMAL, ULTRASOUND, UNKNOWN, WHITE_LIGHT_OPTICAL_DIRECT, WHITE_LIGHT_OPTICAL_TIR, and WHITE_LIGHT_OPTICAL_TOUCHLESS.

Referenced by Print::FromIsoImage().

Here is the caller graph for this function:

◆ IsoToPrintImpression()

constexpr PrintImpression IsoToPrintImpression ( int isoImpression)
staticconstexpr

Function converts ISO impression to PrintImpression.

Parameters
isoImpressioniso impression
Exceptions
EnrollmentInvalidArgumentExceptionfor invalid conversion
Returns
PrintImpression

References LATENT_IMPRESSION, LATENT_LIFT, LATENT_PALM_IMPRESSION, LATENT_PALM_LIFT, LATENT_PALM_PHOTO, LATENT_PALM_TRACING, LATENT_PHOTO, LATENT_TRACING, LIVE_SCAN_OPTICAL_CONCTACTLESS_PLAIN, LIVE_SCAN_PALM, LIVE_SCAN_PLAIN, LIVE_SCAN_ROLLED, LIVE_SCAN_SWIPE, LIVE_SCAN_VERTICAL_ROLL, NONLIVE_SCAN_PALM, NONLIVE_SCAN_PLAIN, NONLIVE_SCAN_ROLLED, OTHER, and UNKNOWN.

Referenced by Print::FromIsoImage().

Here is the caller graph for this function:

◆ IsoToPrintPosition()

constexpr PrintPosition IsoToPrintPosition ( int isoPosition)
staticconstexpr

Function converts ISO position to PrintPosition.

Parameters
isoPositioniso position
Exceptions
EnrollmentInvalidArgumentExceptionfor invalid conversion
Returns
PrintPosition

References LEFT_FULL_PALM, LEFT_HYPOTHENAR, LEFT_INDEX, LEFT_INTERDIGITAL, LEFT_LITTLE, LEFT_LOWER_PALM, LEFT_MIDDLE, LEFT_RING, LEFT_THENAR, LEFT_THUMB, LEFT_UPPER_PALM, LEFT_WRITERS_PALM, RIGHT_FULL_PALM, RIGHT_HYPOTHENAR, RIGHT_INDEX, RIGHT_INTERDIGITAL, RIGHT_LITTLE, RIGHT_LOWER_PALM, RIGHT_MIDDLE, RIGHT_RING, RIGHT_THENAR, RIGHT_THUMB, RIGHT_UPPER_PALM, and RIGHT_WRITERS_PALM.

Referenced by Print::FromIsoImage(), and ICSTemplate::ICSTemplate().

Here is the caller graph for this function:

◆ PrintToIsoCaptureDeviceTechnology()

◆ PrintToIsoImpression()

constexpr int PrintToIsoImpression ( PrintImpression printImpression)
staticconstexpr

Function converts PrintImpression to ISO impression.

Parameters
printImpressionPrintImpression
Exceptions
EnrollmentInvalidArgumentExceptionfor invalid conversion
Returns
ISO impression

References LATENT_IMPRESSION, LATENT_LIFT, LATENT_PALM_IMPRESSION, LATENT_PALM_LIFT, LATENT_PALM_PHOTO, LATENT_PALM_TRACING, LATENT_PHOTO, LATENT_TRACING, LIVE_SCAN_OPTICAL_CONCTACTLESS_PLAIN, LIVE_SCAN_PALM, LIVE_SCAN_PLAIN, LIVE_SCAN_ROLLED, LIVE_SCAN_SWIPE, LIVE_SCAN_VERTICAL_ROLL, NONLIVE_SCAN_PALM, NONLIVE_SCAN_PLAIN, NONLIVE_SCAN_ROLLED, OTHER, and UNKNOWN.

Referenced by ICSTemplate::ToANSI(), and ICSTemplate::ToISO().

Here is the caller graph for this function:

◆ PrintToIsoPosition()

constexpr int PrintToIsoPosition ( PrintPosition position)
staticconstexpr

Function converts Print position to ISO position.

Parameters
positionPrintPosition
Exceptions
EnrollmentInvalidArgumentExceptionwhen conversion is not possible
Returns
ISO Position

References LEFT_FULL_PALM, LEFT_HYPOTHENAR, LEFT_INDEX, LEFT_INTERDIGITAL, LEFT_LITTLE, LEFT_LOWER_PALM, LEFT_MIDDLE, LEFT_RING, LEFT_THENAR, LEFT_THUMB, LEFT_UPPER_PALM, LEFT_WRITERS_PALM, RIGHT_FULL_PALM, RIGHT_HYPOTHENAR, RIGHT_INDEX, RIGHT_INTERDIGITAL, RIGHT_LITTLE, RIGHT_LOWER_PALM, RIGHT_MIDDLE, RIGHT_RING, RIGHT_THENAR, RIGHT_THUMB, RIGHT_UPPER_PALM, and RIGHT_WRITERS_PALM.

Referenced by ICSTemplate::ICSTemplate(), ICSTemplate::ToANSI(), and ICSTemplate::ToISO().

Here is the caller graph for this function: