Menu

convert fingerprint image (BMP / JPG) to ISO 19794-2

clarkynoel
2014-09-10
2018-08-24
  • clarkynoel

    clarkynoel - 2014-09-10

    Is it possible to use SourceAFIS to convert fingerprint image (in BMP or JPG) format to ISO 19794-2 format (record, or standard or compact format) ?

     
  • Robert Važan

    Robert Važan - 2014-09-10

    The last published version of SourceAFIS still stupports it (in C#). Nevertheless, I am now recommending everyone to use images for permanent storage and to generate native templates for whatever recognition engine they are using at the moment. ISO template support will be dropped from newer versions of SourceAFIS for this reason.

     
    • clarkynoel

      clarkynoel - 2014-09-10

      Hi Robert, Thanks for your reply
      Could you provide sample code?
      Sorry, I am still searching from SourceAfis.dll, but still can't find where is the method to generate ISO 19794-2 template. there are no method to load image, and then extract it to ISO 19794-2.

      Fingerprint fp2 = new Fingerprint();
      fp2.AsBitmap = new Bitmap(Bitmap.FromFile("pathToImage"));

      .... how to extract to ISO19794-2

      May I know how do you get the specification of ISO 19794-2 ? I have googling and still can't find the free document for learning ISO 19794-2

      Thanks a lot

       
  • clarkynoel

    clarkynoel - 2014-09-10

    I have 3sample files which contains 'FMR....' identifier. I believe it is ISO 19794-2 Fingerprint Minutea Record format. I still confuse how to get ISO 19794-2 from image with SourceAfis.dll. I wish you could provide sample code. Thanks Robert

     
  • clarkynoel

    clarkynoel - 2014-09-10

    Is this correct ?

    AfisEngine Afis = new AfisEngine();
    Fingerprint fp = new Fingerprint();
    fp.AsBitmap = new Bitmap(Bitmap.FromFile("fp_image1.bmp"));
    Person person = new Person();
    person.Fingerprints.Add(fp);
    Afis.Extract(person);

    byte [] data= fp.AsIsoTemplate;

    BinaryWriter a= new BinaryWriter(File.Open("fp_iso19794-2 from fp_image1.dat",FileMode.Create));
    foreach (byte element in data)
    {
    a.Write(element);
    }

    a.Close();

     
  • clarkynoel

    clarkynoel - 2014-09-10

    is this code correct?

    AfisEngine Afis = new AfisEngine();
    Fingerprint fp = new Fingerprint();
    fp.AsBitmap = new Bitmap(Bitmap.FromFile("fp_image1.bmp"));

    Person person = new Person();
    person.Fingerprints.Add(fp);
    Afis.Extract(person);

    byte [] data= fp.AsIsoTemplate;

    BinaryWriter a= new BinaryWriter(File.Open("iso19794-2 template from fp_image1.dat",FileMode.Create));
    foreach (byte element in data) {
    a.Write(element);
    }

    a.Close();

     
  • Robert Važan

    Robert Važan - 2014-09-19

    Yes, that's correct. Although you could just write File.WriteAllBytes(filename, data). SourceAFIS part of your code is correct.

     
  • Robert Važan

    Robert Važan - 2018-03-16

    Just an update about ISO 19794-2 support: ISO templates are supported in a very limited form that is functional just enough to allow import of ISO templates from sensors that refuse to provide fingerprint image.

     
  • Ahmed Fahmy

    Ahmed Fahmy - 2018-04-15

    hi Robert,

    May you help me getting the source code of the matcher (only the matcher) that compares between ISO/IEC 19794-2 2011 biometric data templates ?
    (I will be glad if it's available in C(or it can be in some way))

    And On what ISO template do your code support specifically ? (kindly check the second point on the first standard description to relate https://secugen.com/biometric-standards/)

    Thanks
    parentheses everywhere :D

     
  • Robert Važan

    Robert Važan - 2018-04-15

    SourceAFIS supports a very minimal subset of ISO/IEC 19794-2:2005 (not 2011) that is barely enough to import minutia data from template-only fingerprint readers.

    You can follow java tutorial:

    https://sourceafis.machinezoo.com/java

    Except that you would use convert() instead of create() when importing ISO templates:

    https://sourceafis.machinezoo.com/javadoc/com/machinezoo/sourceafis/FingerprintTemplate.html#convert-byte:A-

    There is no C port in sight. I am considering Rust port though.

     
    • Alex

      Alex - 2018-08-17

      Please help me with a doubt: when you put this link:
      https://sourceafis.machinezoo.com/javadoc/com/machinezoo/sourceafis/FingerprintTemplate.html#convert-byte:A-

      It means I can convert a template that was storage in a DB ; for example my case is that I storage the templates in a DB PostgreSQL in a field type "bytea" , it's saved in this way:

      \000\370\201\001\310\343s\\300A7\011\253q\260\335\024U\222c\306\004Fx[\277\243$\354>\363\035D<<\303/\353\360\336\3734%\257\216\374\243wx\016\223\210\305\322\023!\333=\223j\377\256\\375\316\277v\020\371{]\347\030\353\3421\311$\223_\316Y\241\365\006\256\323^\361\357\254\300i\265\316\025\206\362\264\037\261\364\355\177\372\341\024\212\177aK\021\257Ud\005\364\266\360T\251\306C\362Q\234\202\365\010\216\275l\000\325\3073\355$Q\016\300\030\011\3676\265\345\334Z\200\355\011U\242\277+\201E\032ih\243\347j\276\356\333yB\367\367\2364{e;\211\314\335\242\214\322~\330\272\3350o\251\254\350Q\2265\006\236\006?\-\007\250\327\037xs5\013L\271\006u0\371.\346\237\311\272\011\225\372\221]\337\027\332\224|+\304[\332j\247\267\265\351\344j+k\263\311Q\371f\227O?\#\255\240d\355c\257\233\330\256\027\245\341\030w\310\261\373E\343mQ\030\233x\330C\000]\226\306bbc\262-/\204\336\2648\262LF\241\031\237/\032He\241\347\337l\344N\242y0~\025rH\224\317\015d3?\363\025\177A\343=c^,I\033\254\231[\202dM\321\220$i\234\316H\030\202\335:f\311j\223\301\330\341\376\376\227\352\245\275\317L\302[\276c\0367\177\316\256n\313\317\324A\345\2201\335J\272\025o\000\370\201\001\310\343s\\300A7\011\253q0\322\024U\222\317\226\220\014\236\231\333-t\025B\024u(8\006b\270Y\340|\343\306\200\335\266f(\242\212\206\231S\272\315\256P\k\3171\257:\223\202\251c\304p\302\226\312\210\202\367\011e\031\343\237\375\014\247\221\246\367\251\3205\3412R\314\373\377\307\372[I_\357[\342\261\265\327@\346\325\371\026\361\336\337\357?\346\353\374\213%\247\304\372\027\325\227\327\222\236N\002\014\360v\234:\270\204Q\221_\367\017t\210\367\331H\010g\000@\22266\303;i%\300}\333.\201\206<\355\244\023\033\300\241atw\350\244\226\361\326\262\007\240g2NH\371>\353\302\354\205V\216g\213\321,\263\202\372\305\347\264?\012\343\341!\336\361\337\017\311\244\213g\302l\355\205\025\237\306[\207;\214<\361\360\214\200\366\205K\216\376\365e\256\266k\270\225*9\016\217\004\320\267\023\025\004<f\3104\266e\347T\266\237\254\332K\265\220\361\350\\036%\251\0121R\337\334\223\025h2( \327\223C{\266Vg\264j\202\365a\376\323\352h\274\037D\366\365\307bi\245H\004\255S\267y\350;\0269\326\203/\010\241_-\226BH\334\022\356\177\013[i\022\032]\303\303\353\322=\205:\277UJ\203\337\363\021\214r\365r\251>_\303\364;@\232\020\027\203\330|\360-2A\201\321\260\215\331\350\200\340\310o\000\370\200\001\310\343s\\300A7\011\253q\360\325\024U\222\026\274\220W\305k''\355\222\375.\362%\357\306\364\320$\310\253\312\370\330c\225\355\003\323\030\267\007jv\016f\361\243vu\037 bK:\255\253\305\324\323\354\243t\024@1hX^O\037\363\037\023\007r+\310#\214\220\217W-\205.\312\256\376F\011e\316\276\3156F+e\013\374\360\001\343\035*\302\320O\2243$-R\242Ri\240\262\031\377;\206\210\364Z\024\307\037JC\222+G\260f5\224n/ T\346:)\002\030j\354b+\272\365o\205\335\245v\321%\204\\213)\262\033\332#\236\237\300\264\301\272\015\023LL~\335\370\361\267\272\346b\374\014j[\331;\036Y\035\302#\214,>\203\306\257c\265\214PF\352\361\016\360\307o;\207\243\006$\0005\372\316i\017\230I\2566\360\342|\001iV\000\350h4J\232\261h\364\316\207S\014gfv\234\266\215\352\366B\275\2054tw\032\\\274GP\315\030.\366\361\037H\222\245\215I\034.\034\036\334\265m@\237\247\034"\271\016\025\334"O;F\204\371O\034\312tb\317f\366\177\236%\015#~\343\034\366#b\213\271_\035\374*\337\260H3\230\215b\245}\250\356/\354\336.\350\345\010t<\216\252\255,G\014v\321\236\015z \322\357\245\034A\276\341=\345S\177C\243\260V\2527\352o\000\350\201\001\310*\343s\\300A7\011\253qp\335\024U\222\354\265\034V\352\266\256\313q\331\033HF\037\320\236\253x,\307)\372\322\210\205\236\343\177\2102\375v\353\230\364o\354\0327:\323\002\260\304\357e\354\2410\325\343\230\220\222\340\266\027(\341\246\202U\351c\235W\011/\313\223\355\014\310@i\340x\341[\377\276\224A\323P\206fB\341S\032\034\006\236r[\220\021\356\270)B\244m\017\200\266\346-\017b\250\253\001V\012dk\225\222|\213\027}\242\012\216\005\351\322\275\023\337\274\334\320\347A\231\223\346\342Y\302M\307\346Ts\263\213\366\216\304b\\\341\336Q\271\024\322*3\252u\225\011\011\243\266\265\306\362\367\212>_&j\351\024\215\374\036\307zV\021^\271\202\375\011\252\004T\032\303\276\001\012\004@\322W\221\237h\202a7~\215\343>b\010\334\347+\355u\333XV\204\213.\313s\274.n\205w\324\264N\303U]l\370\373\023q\357\014\2105$<\342\031\352$d\007C]5\254=\304)"Q\344\036[F\032\012:X\267+\364\217G\304\016\013\304+dv\303\320\024-\022s\037\245aY#\004U\220\356f\377\304a-\267 \022\000\377\203\303\024\332J\254\340\330\324\243\002>\007\363\3426=P\237\327=\376\275\226\265\220\3244\030\027%Fcn\307\014i\367\304+\222\036\312\356\312\233\305SV(\356K\226_o\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000

      The fingerprint I use is U are U 4500 from digital persona. I can match when I read a template from the device against this template storage in DB. So my question is;
      when I recover the fingerprint as type byte :

      PreparedStatement identificarStmt = c.prepareStatement("SELECT name,fingrprint FROM fingerprints");
      ResultSet rs = identificarStmt.executeQuery();
      ....
      byte[] candidateImage = rs.getBytes("fingrprint");

      Can I send "candidateImage" as parameter to the method to compare against other templates from others vendors?

      FingerprintTemplate candidate = new FingerprintTemplate()
      .dpi(500)
      .convert(candidateImage);

      Thanks.

       
      • Robert Važan

        Robert Važan - 2018-08-24

        The fingerprint you posted starts with zero byte. ISO templates start with bytes that read "FMR" in ASCII. This might be some sensor-specific template format. You should try to get fingerprint image from the sensor instead.

         
  • Ahmed Fahmy

    Ahmed Fahmy - 2018-04-15

    Thanks for your reply.

    But, I am not getting what you mean by

    "I am considering Rust port though."

     
  • Robert Važan

    Robert Važan - 2018-04-15

    That means I might do Rust port in the future if I feel like it. Or someone could pay me to do it now. Contrast this with C, which I consider obsolete and dangerous and I would be reluctant to support it. C is still required for some embedded systems, but these are too slow to run feature extractor anyway, although they might be fast enough for matching. I am mostly hoping that Rust gets ported to all the embedded devices that people might reasonably wish to use.

     
  • Ahmed Fahmy

    Ahmed Fahmy - 2018-04-16

    yeah implementation in C is still required, while Rust can be used as you're saying I will check it deeply.

    Refering to your section here https://sourceafis.machinezoo.com/custom#iso

    where can I find this ?

    "freely available description of ISO 19794-2 templates"

     
  • Robert Važan

    Robert Važan - 2018-04-16

    Such "freely available description of ISO 19794-2 templates" doesn't exist yet. The whole point of custom development page is to suggest features that can be sponsored.

    If you just need to import templates from existing fingerprint reader, the minimal implementation present in SourceAFIS should be enough. Full ISO support is likely necessary only for compliance.

     
    • Ahmed Fahmy

      Ahmed Fahmy - 2018-04-16

      The idea is that there are 3 data formats inside ISO/IEC 19794-2 itself
      1- Record-based format.
      2- Normal format => for use on a smart card in a match-on-card application.
      3- Compact format => for use on a smart card in a match-on-card application.
      Which one does SourceAFIS support ?

      May you let me know if there is any updates regarding ""freely available description of ISO 19794-2 templates" ? :-)

       
  • Ahmed Fahmy

    Ahmed Fahmy - 2018-04-16

    those three ISO formats can be found being referred to. here https://secugen.com/biometric-standards/

     
  • Robert Važan

    Robert Važan - 2018-04-16

    I don't have a copy of the ISO template specification. It is not available for download. I guess SourceAFIS uses the first format.

     
  • Robert Važan

    Robert Važan - 2018-08-12

    I can confirm that SourceAFIS uses the record-based format from ISO 19794-2. SourceAFIS doesn't support either of the smartcard formats defined in ISO 19794-2.

     
  • Sai Sumanth

    Sai Sumanth - 2022-04-20
    Post awaiting moderation.
  • Sai Sumanth

    Sai Sumanth - 2022-04-20
    Post awaiting moderation.
  • Sai Sumanth

    Sai Sumanth - 2022-04-20
    Post awaiting moderation.

Log in to post a comment.