robertvazan / sourceafis-java

Fingerprint recognition engine for Java that takes a pair of human fingerprint images and returns their similarity score. Supports efficient 1:N search.
https://sourceafis.machinezoo.com/java
Apache License 2.0
245 stars 100 forks source link

Match/compare two fingerprint templates #28

Closed dan-developer closed 4 years ago

dan-developer commented 4 years ago

I want to test a string (captured by the digital biometric device) and I want to compare it with other templates. In the examples I only found opening an image, I want to pass the string directly, because I already have the template string. I want to know the comparison score or if it's the same finger. How should I do?

Below two readings from the same finger:


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


robertvazan commented 4 years ago

The template starts with magic ICRS21, which indicates it is an undocumented proprietary template format created by Innovatrics. You will need either an image or an ANSI/ISO template. SourceAFIS wouldn't work with proprietary templates from random vendors.

dan-developer commented 4 years ago

Thank you for your response.

I ended up sending the wrong ones, follow again, see if this is supported (I configured it to export as ISO):

Rk1SACAyMAAAAAEaAAABBAEsAMUAxQEAAAAAKkC4ABBlXYCCACB1ZEDFACxmXYDMADjhZECaADnlZICEAEVvZED0AEhgZECyAFpoXUA+AGKRZICHAGXkZEBuAGqCZIDcAGzWZIBPAHIIZEAmAHqWZECAAHt8ZIA/AIQKZEAuAIybZEBvAJOKZEDTAJtRZIB1AKbOZIAXAKykZEDQAK3KZIBGALivZICqALy7ZEAYAMGvZECRAM2zXYAsAM63ZEDCANC/ZIBNAPUkXUCVAPyrZIA7AQMTXYC1AQO3ZEB6AQQsZEAsAQhCZIASAQvPXUBoAQ+YZIA+ARMNZIB5ARSkXYCTARSsXUCAARgrXUBQARt6ZIATAR/QXQAA


Rk1SACAyMAAAAADYAAABBAEsAMUAxQEAAAAAH4COACTkZIBYACvoZEC6ADRjZIBKADdxZEB0AEhpXYBMAFfoZIChAFjZZECJAFzYZEAyAF6CZIBDAHCCZEA3AIaPZECcAIdUZEBBAJTRZECZAJfNZIB1AKjAZEAPAK20ZICMAL3BZIBTAMuyZIAgANc1ZEAnAOEyXUAZAOlEXYCGAO27ZEAkAO4wXYBrAPCvZEARAPM6XUBOAPUxZEA7AQOcZEBJAQSnZIBmAQSvZECeAQW5ZIBaAQcuZAAA

dan-developer commented 4 years ago

I try this implemetation:

        String template1 = "Rk1SACAyMAAAAAEaAAABBAEsAMUAxQEAAAAAKkC4ABBlXYCCACB1ZEDFACxmXYDMADjhZECaADnlZICEAEVvZED0AEhgZECyAFpoXUA+AGKRZICHAGXkZEBuAGqCZIDcAGzWZIBPAHIIZEAmAHqWZECAAHt8ZIA/AIQKZEAuAIybZEBvAJOKZEDTAJtRZIB1AKbOZIAXAKykZEDQAK3KZIBGALivZICqALy7ZEAYAMGvZECRAM2zXYAsAM63ZEDCANC/ZIBNAPUkXUCVAPyrZIA7AQMTXYC1AQO3ZEB6AQQsZEAsAQhCZIASAQvPXUBoAQ+YZIA+ARMNZIB5ARSkXYCTARSsXUCAARgrXUBQARt6ZIATAR/QXQAA";
        String template2 = "Rk1SACAyMAAAAADYAAABBAEsAMUAxQEAAAAAH4COACTkZIBYACvoZEC6ADRjZIBKADdxZEB0AEhpXYBMAFfoZIChAFjZZECJAFzYZEAyAF6CZIBDAHCCZEA3AIaPZECcAIdUZEBBAJTRZECZAJfNZIB1AKjAZEAPAK20ZICMAL3BZIBTAMuyZIAgANc1ZEAnAOEyXUAZAOlEXYCGAO27ZEAkAO4wXYBrAPCvZEARAPM6XUBOAPUxZEA7AQOcZEBJAQSnZIBmAQSvZECeAQW5ZIBaAQcuZAAA";

        byte[] template1BytesArray = Base64.getDecoder().decode(template1.getBytes());
        byte[] template2BytesArray = Base64.getDecoder().decode(template2.getBytes());

        FingerprintTemplate probe = new FingerprintTemplate(template1BytesArray);
        FingerprintTemplate candidate = new FingerprintTemplate(template2BytesArray);

        double score = new FingerprintMatcher()
                .index(probe)
                .match(candidate);
        System.out.println(score);

The result is: 164.92244157304955 Same finger but another read from biometric sensor.

        String template1 = "Rk1SACAyMAAAAAEaAAABBAEsAMUAxQEAAAAAKkC4ABBlXYCCACB1ZEDFACxmXYDMADjhZECaADnlZICEAEVvZED0AEhgZECyAFpoXUA+AGKRZICHAGXkZEBuAGqCZIDcAGzWZIBPAHIIZEAmAHqWZECAAHt8ZIA/AIQKZEAuAIybZEBvAJOKZEDTAJtRZIB1AKbOZIAXAKykZEDQAK3KZIBGALivZICqALy7ZEAYAMGvZECRAM2zXYAsAM63ZEDCANC/ZIBNAPUkXUCVAPyrZIA7AQMTXYC1AQO3ZEB6AQQsZEAsAQhCZIASAQvPXUBoAQ+YZIA+ARMNZIB5ARSkXYCTARSsXUCAARgrXUBQARt6ZIATAR/QXQAA";
        String template2 = "Rk1SACAyMAAAAAEaAAABBAEsAMUAxQEAAAAAKkC4ABBlXYCCACB1ZEDFACxmXYDMADjhZECaADnlZICEAEVvZED0AEhgZECyAFpoXUA+AGKRZICHAGXkZEBuAGqCZIDcAGzWZIBPAHIIZEAmAHqWZECAAHt8ZIA/AIQKZEAuAIybZEBvAJOKZEDTAJtRZIB1AKbOZIAXAKykZEDQAK3KZIBGALivZICqALy7ZEAYAMGvZECRAM2zXYAsAM63ZEDCANC/ZIBNAPUkXUCVAPyrZIA7AQMTXYC1AQO3ZEB6AQQsZEAsAQhCZIASAQvPXUBoAQ+YZIA+ARMNZIB5ARSkXYCTARSsXUCAARgrXUBQARt6ZIATAR/QXQAA";

        byte[] template1BytesArray = Base64.getDecoder().decode(template1.getBytes());
        byte[] template2BytesArray = Base64.getDecoder().decode(template2.getBytes());

        FingerprintTemplate probe = new FingerprintTemplate(template1BytesArray);
        FingerprintTemplate candidate = new FingerprintTemplate(template2BytesArray);

        double score = new FingerprintMatcher()
                .index(probe)
                .match(candidate);

        System.out.println(score);

The result is: 501.7640040162884 But the two are the same. Can you help me to implement?

dan-developer commented 4 years ago

I think I'm in luck, as I passed the template1Bytes in the FingerprintCompatibility.convert(byte[]) function and didn't raise any exception.

String template1 = "Rk1SACAyMAAAAAEaAAABBAEsAMUAxQEAAAAAKkC4ABBlXYCCACB1ZEDFACxmXYDMADjhZECaADnlZICEAEVvZED0AEhgZECyAFpoXUA+AGKRZICHAGXkZEBuAGqCZIDcAGzWZIBPAHIIZEAmAHqWZECAAHt8ZIA/AIQKZEAuAIybZEBvAJOKZEDTAJtRZIB1AKbOZIAXAKykZEDQAK3KZIBGALivZICqALy7ZEAYAMGvZECRAM2zXYAsAM63ZEDCANC/ZIBNAPUkXUCVAPyrZIA7AQMTXYC1AQO3ZEB6AQQsZEAsAQhCZIASAQvPXUBoAQ+YZIA+ARMNZIB5ARSkXYCTARSsXUCAARgrXUBQARt6ZIATAR/QXQAA";

byte[] template1BytesArray = Base64.getDecoder().decode(template1.getBytes());

FingerprintCompatibility.convert(template1BytesArray);
robertvazan commented 4 years ago

FingerprintCompatibility is indeed the right class to use. Similarity score 164 is very good. Looks like the problem is solved.

dan-developer commented 4 years ago

What minimum score is recommended? How much does this score go? I thought it was something from 0 to 100, but even with identical templates it gives a broken number.