如何使用png图像或中间格式的Digital Persona SDK比较指纹?

问题描述 投票:3回答:3

我正在尝试使用DigitalPersona SDK v 3.0.0比较java中的两个指纹,但我认为FMD是无效错误或有时我得到传递给API调用的一个或多个参数无效。

我有一个从Javascript API获得的png图像,我试图创建一个FID然后像这个帖子中的FDM一样example

但我不知道如何获得方法参数:inDpi,fingerPosition,cbeffId,outDpi和rotate180来获得de Fid

在)UareUGlobal.getImporter在=(。ImportRaw(rawPixels,宽度,高度,inDpi,fingerPosition,cbeffId,Fid.Format.ANSI_381_2004,outDpi,rotate180)

我也尝试过使用中间格式的ImportFmd而没有成功

任何帮助将不胜感激

java fingerprint digital-persona-sdk
3个回答
2
投票

这个代码对我有用,就像数字人物4500模型一样。

private boolean ProcessCaptureResult(CaptureThread.CaptureEvent evt) throws IOException{
        boolean bCanceled = false;
//        CaptureThread.CaptureEvent evt = evt;

        if(null != evt.capture_result){
                    System.out.println("This is Processing Capture");
            if(null != evt.capture_result.image && Reader.CaptureQuality.GOOD == evt.capture_result.quality){
                //extract features
                Engine engine = UareUGlobal.GetEngine();

                try{
                    Fmd fmd = engine.CreateFmd(evt.capture_result.image, 
            Fmd.Format.ISO_19794_2_2005;
  BufferedImage img=ImageIO.read(new File("C:\\Users\\User\\Documents\\NetBeansProjects\\FingerPrintApp\\MembersImages","imag6.jpg"));
                                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ImageIO.write( img, "jpg", baos );
    baos.flush();
    byte[] imageInByte = baos.toByteArray();
    baos.close();
//                                        Fmd fmd1 = engine.CreateFmd(img, 0xa, 0xa, 0x14, Fmd.Format.ANSI_378_2004);
                                        Fmd fmd2=UareUGlobal.GetEngine().CreateFmd(
                    toBytes(img),
                    img.getWidth(),
                    img.getHeight(),
                    500, 0, 3407615, Fmd.Format.ISO_19794_2_2005
                                        );
                                       System.out.println("Resulotion: "+evt.capture_result.image.getImageResolution()); ;
                                        System.out.println("ID : "+evt.capture_result.image.getCbeffId()); ;
                                           System.out.println(evt.capture_result.image.getData());

//                  if(null == m_fmds[0])
                                            m_fmds[0] = fmd;
//                  else if(null == m_fmds[1]) 
                                            m_fmds[1] = fmd2;
                }
                catch(UareUException e){ System.out.println("Engine.CreateFmd() "+e.getMessage()); }

//              if(null != m_fmds[0] &&  null != m_fmds[1]){
                    //perform comparison
                    try{
                                            System.out.println(m_fmds[0].getFormat().name());
                        int falsematch_rate = engine.Compare(m_fmds[0], 0, m_fmds[1], 0);

                        int target_falsematch_rate = Engine.PROBABILITY_ONE / 100000; //target rate is 0.00001
                        if(falsematch_rate < target_falsematch_rate){
                            System.out.println("Fingerprints matched.\n");
                            String str = String.format("dissimilarity score: 0x%x.\n", falsematch_rate);
                            System.out.println(str);
                            str = String.format("false match rate: %e.\n\n\n", (double)(falsematch_rate / Engine.PROBABILITY_ONE));
                            System.out.println(str);
                        }
                        else{
                            System.out.println("Fingerprints did not match.\n\n\n");
                        }
                    }
                    catch(UareUException e){ System.out.println("Engine.CreateFmd()"+ e.getMessage()); }

                    //discard FMDs
                    m_fmds[0] = null;
                    m_fmds[1] = null;

                    //the new loop starts
                    System.out.println(m_strPrompt1);
//              }
//              else{
//                  //the loop continues
//                  System.out.println(m_strPrompt2);
//              }
            }
            else if(Reader.CaptureQuality.CANCELED == evt.capture_result.quality){
                //capture or streaming was canceled, just quit
                bCanceled = true;
            }
            else{
                //bad quality
                MessageBox.BadQuality(evt.capture_result.quality);
            }
        }
        else if(null != evt.exception){
            //exception during capture
            MessageBox.DpError("Capture", evt.exception);
            bCanceled = true;
        }
        else if(null != evt.reader_status){
            //reader failure
            MessageBox.BadStatus(evt.reader_status);
            bCanceled = true;
        }

        return !bCanceled;
    }
    public static byte[] toBytes(BufferedImage image) {
    WritableRaster raster = image.getRaster();
    DataBufferByte data = (DataBufferByte) raster.getDataBuffer();

    return (data.getData());
}
    -

  • Code working in digital persona 4500

2
投票

好吧,我目前正在研究那个。 UareU SDK V3.0.0,

但我在验证和比较功能方面遇到问题。

但是,要回答您的问题,如果您有指纹图像, 您可以直接将图像导入Fmd。我是这个意思(我使用ISO标准):

Fmd fmd = UareUGlobal.GetEngine().CreateFmd(bInput, 500, 550, 700, 0, 0, Fmd.Format.ISO_19794_2_2005)

然后,你可以用这个compare直接做verifyfmd。 注意:必须根据图像和阅读器更改高度,分辨率。 cbeffid参数,我试过0和1。 如果有人找到了这个参数的正确答案,请建议我。 CBEFF

错误

API调用无效

大多数情况下,我发现分辨率,指纹格式和手指位置参数是正确的。指纹参数,我通常设置为0(第一个手指或第一个视图)

更新 如果你正在使用javascript。我建议你首先将base64字符串从javascript转换为bufferedImage

    public static Fmd importImageString(String image) throws UnsupportedEncodingException, IOException, UareUException {
    byte[] bytes = Base64.getDecoder().decode(image.getBytes("UTF-8"));
    if (null != bytes && bytes.length > 0) {
        ByteArrayInputStream stream = new ByteArrayInputStream(bytes);
        BufferedImage buf = ImageIO.read(stream);
        if (null != buf) {
            return UareUGlobal.GetEngine().CreateFmd(
                    TestDPuareU.toBytes(buf),
                    buf.getWidth(),
                    buf.getHeight(),
                    500, 0, 1, Fmd.Format.ISO_19794_2_2005
            );
        }
    }
    return null;
}

public static byte[] toBytes(BufferedImage image) throws IOException {
    WritableRaster raster = image.getRaster();
    DataBufferByte data = (DataBufferByte) raster.getDataBuffer();

    return (data.getData());
}

image我从javascript(var fingersdk.onSamplesAcquired = function (s)得到它,如下所示

var samples = JSON.parse(s.samples);
var finger = Fingerprint.b64UrlTo64(samples[0])

1
投票

这样的事情是你如何获得这些价值,但我得到相同的错误PID是无效的,所以祝你好运,无论你有答案,我希望你分享它,问候。

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

data = m_fmd.getData();
width = m_fmd.getWidth();
height = m_fmd.getHeight();
resolution = m_fmd.getResolution();
finger_position = m_fmd.getCaptureEquipmentCompliance();
cbeff_id = m_fmd.getCbeffId();
format = m_fmd.getFormat();
© www.soinside.com 2019 - 2024. All rights reserved.