Error integration fingerprint U.are.U SDK with jav

2020-08-01 06:36发布

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!

2条回答
SAY GOODBYE
2楼-- · 2020-08-01 07:01

I use this method to get a successful result, being m_fmdAuxiliar a variable which store the data from DB, I just save data then I retrieve.

m_fmd = m_engine.CreateFmd(cap_result.image, Fmd.Format.ANSI_378_2004);
data = m_fmd.getData();

Fmd m_fmdAuxiliar = UareUGlobal.GetImporter().ImportFmd(data, Fmd.Format.ANSI_378_2004, Fmd.Format.ANSI_378_2004);

Fmd m_fmd2 = m_engine.CreateFmd(cap_result.image, Fmd.Format.ANSI_378_2004);
m_score = m_engine.Compare(m_fmdAuxiliar, 0, m_fmd2, 0);
查看更多
来,给爷笑一个
3楼-- · 2020-08-01 07:28
  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

查看更多
登录 后发表回答