Search code examples
javascriptjavaplayframeworkfingerprint

Error integration fingerprint U.are.U SDK with java web application


I developed a web application using Java and play framework in the BackEnd, and AngularJS in the FrontEnd.

I did an integration with the U.are.U SDK for fingerprint scanning, however I'm getting an error while trying to compare two equal fingerprints.

This is my code in the Angular part:

if(currentFormat == Fingerprint.SampleFormat.PngImage){
        localStorage.setItem("imageSrc", "");
        var samples = JSON.parse(s.samples); //parse json
        var finger = Fingerprint.b64UrlTo64(samples[0]); // convertion to Base64

        localStorage.setItem("imageSrc", "data:image/png;base64," + finger);

        var vDiv = document.getElementById('imagediv');
        vDiv.innerHTML = "";
        var image = document.createElement("img");
        image.id = "image";
        image.src = localStorage.getItem("imageSrc");
        vDiv.appendChild(image);

        AuthService.fingerValidation(finger, vm.username, function(response){
          showMessage("Login biométrico", response);
        });
    }

Where I captured the fingerprint with the javascript API of this SDK.

He then sent a Base64 String to the web service and performed the following procedure:

UserFingerPrint print = fingerprintService.getFinderByUser(data.getUsername()); //Db data
if (print != null) {
    String equals = "";
    //'finger' is the base64 String from JavaScript
    //Convert finger to byte[]
    byte[] bytesImage = fingerprintService.getFMD(Base64.decodeBase64(finger), "first"); 

    //Convert byte[] to FMD format from SDK with parameters of image example
    Fmd fmd = UareUGlobal.GetEngine().CreateFmd(bytesImage, 320, 350, 500, 1, 3407615, Fmd.Format.ANSI_378_2004);

    //Image from DB
    byte[] imageDB = fingerprintService.resizeImage(print.getImage());
    Fmd fmd2 = UareUGlobal.GetEngine().CreateFmd(imageDB, 320, 350, 500, 1, 3407615, Fmd.Format.ANSI_378_2004);

    //The error is when comparing with the following method.
    //The fingerprint is always different, even if it is the same image.
    int falsematch_rate = UareUGlobal.GetEngine().Compare(fmd, 0, fmd2, 0);
    int target_falsematch_rate = Engine.PROBABILITY_ONE / 100000;
    if (falsematch_rate < target_falsematch_rate) {
        equals = "match success";
    } else {
        equals = "No match"
    }
}

Has anyone converted an image to FMD that can help me? Thanks!


Solution

    1. Convert your PNG image to raw bytearray in grayscale:

           // read an image from the disk
           BufferedImage image = ImageIO.read(new File("kittens.jpg"));
      
           setPreferredSize(new Dimension(
               image.getWidth(),image.getHeight()));
      
           // create a grayscale image the same size
           gray = new BufferedImage(image.getWidth(),image.getHeight(),
               BufferedImage.TYPE_BYTE_GRAY);
      
           // convert the original colored image to grayscale
           ColorConvertOp op = new ColorConvertOp(
               image.getColorModel().getColorSpace(),
               gray.getColorModel().getColorSpace(),null);
           op.filter(image,gray);
      
           //convert BuffuredImage to raw byte array
           WritableRaster raster = gray.getRaster();
           DataBufferByte data = (DataBufferByte) raster.getDataBuffer();    
           byte[] rawPixels = data.getData();
      
    2. convert your bytearray to FID

           Fid fid = UareUGlobal.getImporter().ImportRaw(rawPixels, 
               width, height, inDpi, fingerPosition, cbeffId, 
               Fid.Format.ANSI_381_2004, outDpi, rotate180);
      
    3. convert your FID to FMD

           Fmd fmd = UareUGlobal.GetEngine().CreateFmd(fid, 
               Fid.Format.ANSI_381_2004);
      
    4. Now you could compare this Fmd with current capture