【问题标题】:Digital Persona Finger Print Verification from DataBase not working来自数据库的数字角色指纹验证不起作用
【发布时间】:2017-06-04 05:21:12
【问题描述】:
   Device  :  Digital Persona u.are.u 4500 

注册时,我以image 格式将数据保存在 sql 数据库中(sql 数据类型为图像)它工作正常我的数据已正确保存在数据库中,但现在当我在验证期间验证数据时,它会给出异常

hresult : 0xffff.

这是我用于验证的 C# 代码

SqlConnection conn = new SqlConnection(connetionstring);
conn.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM mySavedDataTable", conn);
MemoryStream ms;
byte[] fpBytes;
SqlDataAdapter sd = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
sd.Fill(dt);

foreach (DataRow dr in dt.Rows)
{
    fpBytes = Encoding.UTF8.GetBytes(dr["Template"].ToString());
    ms = new System.IO.MemoryStream(fpBytes);
    DPFP.Template template = new DPFP.Template();
    template.Serialize(ms);
    Verificator.Verify(features, template, ref result);
    if (result.Verified)
    {
        ver = true;
        break;
    }
}
conn.Close();

【问题讨论】:

    标签: c# sql biometrics digital-persona-sdk


    【解决方案1】:

    我已经这样做了,它就像魅力一样!

    DataResult<Fmd> resultConversion = null;
    IdentifyResult identifyResult = null;
    string MobileNumber = "";
    string Cnic = "";
    
    // Check capture quality and throw an error if bad.
    if (!this.CheckCaptureResult(captureResult)) return;
    // See the SDK documentation for an explanation on threshold scores.
    int thresholdScore = DPFJ_PROBABILITY_ONE * 1 / 100000;
    DataSet dataSetBiometric = DatabaseHandler.getData("select CNIC, MOBILE_NUMBER, BIOMETRIC from ACCOUNT_OPENING");
    //select CNIC, MOBILE_NUMBER, BIOMETRIC from ACCOUNT_OPENING
    Fmd[] fmds = new Fmd[dataSetBiometric.Tables[0].Rows.Count];
    for (int i = 0; i < dataSetBiometric.Tables[0].Rows.Count; i++)
    {
        fmds[0] = Fmd.DeserializeXml(dataSetBiometric.Tables[0].Rows[i]["BIOMETRIC"].ToString());//BIOMETRIC
        resultConversion = FeatureExtraction.CreateFmdFromFid(captureResult.Data, Constants.Formats.Fmd.ANSI);
        identifyResult = Comparison.Identify(resultConversion.Data, 0, fmds, thresholdScore, dataSetBiometric.Tables[0].Rows.Count);
        if (identifyResult.ResultCode == Constants.ResultCode.DP_SUCCESS)
        {
            MobileNumber = dataSetBiometric.Tables[0].Rows[i]["MOBILE_NUMBER"].ToString();
            Cnic = dataSetBiometric.Tables[0].Rows[i]["CNIC"].ToString();
            break;
        }
    }
    

    【讨论】:

    • Muhammad 在我的数字角色 U.are.U 4500 sdk 中没有提供你的功能,对我不起作用
    • 我的库是 DPUruNet.dll 版本 1.0.0.767
    【解决方案2】:

    Integração com Digital Persona 4500 指纹

    Aqui faço o Insert dos dados

     protected override void Process(DPFP.Sample Sample)
        {
            base.Process(Sample);
            var app = new Aplicacao_Biometria();
            int id = 1;
            var result = app.Listar_Planos_id(id);
    
            // Process the sample and create a feature set for the enrollment purpose.
            DPFP.FeatureSet features = ExtractFeatures(Sample, DPFP.Processing.DataPurpose.Enrollment);
    
            // Check quality of the sample and add to enroller if it's good
            if (features != null) try
                {
                    MakeReport("The fingerprint feature set was created.");
                    Enroller.AddFeatures(features);     // Add feature set to template.
                }
                finally
                {
                    UpdateStatus();
    
                    // Check if template has been created.
                    switch (Enroller.TemplateStatus)
                    {
                        case DPFP.Processing.Enrollment.Status.Ready:   // report success and stop capturing
                            OnTemplate(Enroller.Template);
    
                            //byte[] byted;
                            //byted = Enroller.Template.Bytes;
    
                            MemoryStream fingerprintData = new MemoryStream();
                            Enroller.Template.Serialize(fingerprintData);
                            fingerprintData.Position = 0;
                            BinaryReader br = new BinaryReader(fingerprintData);
                            Byte[] bytes = br.ReadBytes((Int32)Enroller.Template.Bytes.Length);
    
                            //Insert the file into database
                            SqlConnection cn = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;
                          AttachDbFilename=c:\Users\Gabriel\Documents\Visual Studio 2015\Projects\Projeto_Fisioativa_Desktop\Projeto_Fisioativa_Desktop2\Bd_Fisio_Desktop.mdf;
                          Integrated Security=True;
                          Connect Timeout=30;");
                            SqlCommand cmd;
    
                            if (result.Count != 0)
                            {
                                cmd = new SqlCommand("UPDATE Biometrias set biometria = @biometria, id_usuario = @id_usuario ", cn);
                                cmd.Parameters.Add("biometria", SqlDbType.Binary).Value = bytes;
                                cmd.Parameters.Add("id_usuario", SqlDbType.Int).Value = id;
                            }
                            else
                            {
                                cmd = new SqlCommand("INSERT INTO Biometrias VALUES(@biometria, @id_usuario)", cn);
                                cmd.Parameters.Add("biometria", SqlDbType.Binary).Value = bytes;
                                cmd.Parameters.Add("id_usuario", SqlDbType.Int).Value = 1;
                            }
    
    
    
                            cn.Open();
                            cmd.ExecuteNonQuery();
                            cn.Close();
    
                            SetPrompt("Click Close, and then click Fingerprint Verification.");
                            Stop();
                            break;
    
                        case DPFP.Processing.Enrollment.Status.Failed:  // report failure and restart capturing
                            Enroller.Clear();
                            Stop();
                            UpdateStatus();
                            OnTemplate(null);
                            Start();
                            break;
                    }
                }
        }
    

    Aqui faço busco os dados do banco e faço a comparação

    protected override void Process(DPFP.Sample Sample)
        {
            SqlConnection conn = new SqlConnection("Your connection string");
            conn.Open();
            SqlCommand cmd = new SqlCommand("select * from Biometrias", conn);
            SqlDataAdapter sd = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();
            sd.Fill(dt);
    
            foreach (DataRow dr in dt.Rows)
            {
                byte[] _img = (byte[])dr["biometria"];
                MemoryStream ms = new MemoryStream(_img);
    
                DPFP.Template Template = new DPFP.Template();
                Template.DeSerialize(ms);
                DPFP.Verification.Verification Verificator = new DPFP.Verification.Verification();
    
                base.Process(Sample);
    
                DPFP.FeatureSet features = ExtractFeatures(Sample, DPFP.Processing.DataPurpose.Verification);
                if (features != null)
                {
                    DPFP.Verification.Verification.Result result = new DPFP.Verification.Verification.Result();
                    Verificator.Verify(features, Template, ref result);
                    UpdateStatus(result.FARAchieved);
                    if (result.Verified)
                        MakeReport("The fingerprint was VERIFIED.");
                    else
                        MakeReport("The fingerprint was NOT VERIFIED.");
                }
            }
        }
    

    【讨论】:

    • 我会推荐一个基于英语的答案,以便社区能够理解。
    • 英文第一部分是Integration with Persona 4500 Digital Fingerprint - Here I do the Data Insert。第二部分Here I search the data of the bank and make the comparison
    【解决方案3】:
                            if (Sql.State == ConnectionState.Closed)
                            {
                                Sql.Open();
                            }
    
                            SqlCommand a1 = new SqlCommand("Select FingerPrint,[REF NO] 
                            from Members", Sql);
                            SqlDataReader SDR = a1.ExecuteReader();
    
                            while (SDR.Read())
                            {
    
                                ret = fpInstance.Match(CapTmp, (byte[])(SDR[0]));
    
                                if (ret > 30)
                                {
                                    a = SDR[1].ToString();
                                    break;
                                }
                            }
    

    【讨论】:

    • 只有代码的答案通常被认为是低质量的。您能否为您的答案添加解释。
    【解决方案4】:

    我已经这样做了,希望对您有所帮助(完整的工作解决方案)Digital Persona onetouch sdk

    Imports System.Reflection.MethodBase
    Imports System.Data.SqlClient
    Imports System.IO
    
    Public Class frmThumbEnrol
        Implements DPFP.Capture.EventHandler
    
        Private Capturer As DPFP.Capture.Capture
        Delegate Sub FunctionCall(ByVal param)
    
        Private Event OnTemplate(ByVal template)
    
        Private Enroller As DPFP.Processing.Enrollment
        Public Sel_UsrID As String
    
        Public Enum Thumb
            Enrol
            Verify
        End Enum
        Public theModule As Thumb
    
        Private Sub Me_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Try
                If theModule = Thumb.Enrol Then
                    Me.Text = "[ Thumb Impression - Enrol ]"
                    Me.btnSave.Visible = True
                    Me.btnClose.Text = "Cancel"
                Else
                    Me.Text = "[ Thumb Impression - Verify ]"
                    Me.btnSave.Visible = False
                    Me.btnClose.Text = "Close"
                End If
    
                Me.txtStatus.Clear()
                Me.PBoxThumb.Image = Nothing
                Me.lblCount.Text = ""
    
                Init()
    
                StartCapture()
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
        End Sub
    
        Public Overridable Sub Init()
            Try
    
                Capturer = New DPFP.Capture.Capture() 'create a capture operation.
                Enroller = New DPFP.Processing.Enrollment
    
                Me.lblCount.Text = IIf(theModule = Thumb.Enrol, "Fingerprint Samples Needed: " & Enroller.FeaturesNeeded.ToString, "")
    
                If (Not Capturer Is Nothing) Then
                    Capturer.EventHandler = Me 'capturing events.
                Else
                    MakeReport("Can't initiate capture operation!")
                End If
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
        End Sub
    
        Private Sub StartCapture()
            Try
    
                If (Not Capturer Is Nothing) Then
                    Capturer.StartCapture()
                End If
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
        End Sub
    
        '------------------------------------------------------------------------------------------------------------------
        Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click
            Try
    
                StopCapture()
    
                Me.Close()
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
        End Sub
    
        Private Sub StopCapture()
            Try
    
                If (Not Capturer Is Nothing) Then
                    Capturer.StopCapture()
                End If
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
        End Sub
    
        '------------------------------------------------------------------------------------------------------------------
        Private Sub OnReaderConnect(ByVal Capture As Object, ByVal ReaderSerialNumber As String) Implements DPFP.Capture.EventHandler.OnReaderConnect
            Try
    
                MakeReport("The fingerprint reader was connected.")
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
        End Sub
        Private Sub OnReaderDisconnect(ByVal Capture As Object, ByVal ReaderSerialNumber As String) Implements DPFP.Capture.EventHandler.OnReaderDisconnect
            Try
    
                MakeReport("The fingerprint reader was disconnected.")
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
        End Sub
    
        Private Sub OnFingerTouch(ByVal Capture As Object, ByVal ReaderSerialNumber As String) Implements DPFP.Capture.EventHandler.OnFingerTouch
            Try
    
                MakeReport("The fingerprint reader was touched.")
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
        End Sub
        Private Sub OnFingerGone(ByVal Capture As Object, ByVal ReaderSerialNumber As String) Implements DPFP.Capture.EventHandler.OnFingerGone
            Try
    
                MakeReport("The finger was removed from the fingerprint reader.")
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
        End Sub
    
        Private Sub OnComplete(ByVal Capture As Object, ByVal ReaderSerialNumber As String, ByVal Sample As DPFP.Sample) Implements DPFP.Capture.EventHandler.OnComplete
            Try
    
                MakeReport("The fingerprint sample was captured.")
    
                If theModule = Thumb.Enrol Then
                    Process_Enrol(Sample)
                Else
                    Process_Verify(Sample)
                End If
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
        End Sub
    
        Private Sub OnSampleQuality(ByVal Capture As Object, ByVal ReaderSerialNumber As String, ByVal CaptureFeedback As DPFP.Capture.CaptureFeedback) Implements DPFP.Capture.EventHandler.OnSampleQuality
            Try
    
                If CaptureFeedback = DPFP.Capture.CaptureFeedback.Good Then
                    MakeReport("The quality of the fingerprint sample is good.")
                Else
                    MakeReport("The quality of the fingerprint sample is poor.")
                End If
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
        End Sub
    
        Private Sub MakeReport(ByVal status)
            Try
    
                Invoke(New FunctionCall(AddressOf _MakeReport), status)
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
        End Sub
        Private Sub _MakeReport(ByVal status)
            Try
    
                Me.txtStatus.AppendText(status + Chr(13) + Chr(10))
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
        End Sub
    
        '------------------------------------------------------------------------------------------------------------------
        Protected Sub DrawPicture(ByVal bmp)
            Invoke(New FunctionCall(AddressOf _DrawPicture), bmp)
        End Sub
        Private Sub _DrawPicture(ByVal bmp)
            Me.PBoxThumb.Image = New Bitmap(bmp, Me.PBoxThumb.Size)
        End Sub
    
        Private Function ConvertSampleToBitmap(ByVal Sample As DPFP.Sample) As Bitmap
            Dim bitmap As Bitmap = Nothing
    
            Try
    
                Dim convertor As New DPFP.Capture.SampleConversion()
    
                convertor.ConvertToPicture(Sample, bitmap)
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
    
            Return bitmap
    
        End Function
    
        Private Function Extract_Features(ByVal Sample As DPFP.Sample, ByVal Purpose As DPFP.Processing.DataPurpose) As DPFP.FeatureSet
            Try
    
                Dim extractor As New DPFP.Processing.FeatureExtraction()    ' Create a feature extractor
                Dim feedback As DPFP.Capture.CaptureFeedback = DPFP.Capture.CaptureFeedback.None
                Dim features As New DPFP.FeatureSet()
    
                extractor.CreateFeatureSet(Sample, Purpose, feedback, features) ' TODO: return features as a result?
    
                If (feedback = DPFP.Capture.CaptureFeedback.Good) Then
                    Return features
                End If
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
    
            Return Nothing
    
        End Function
    
        Protected Sub SetStatus(ByVal status)
            Try
    
                Invoke(New FunctionCall(AddressOf _SetStatus), status)
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
        End Sub
        Private Sub _SetStatus(ByVal status)
            Try
    
                Me.lblCount.Text = status
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
        End Sub
    
        'Template Enrol
        Private Sub Process_Enrol(ByVal Sample As DPFP.Sample)
            Try
                DrawPicture(ConvertSampleToBitmap(Sample))
    
                Dim Features_Enrol As DPFP.FeatureSet = Extract_Features(Sample, DPFP.Processing.DataPurpose.Enrollment)
    
                If Not Features_Enrol Is Nothing Then 'Check quality of the sample if it's good
                    Try
                        MakeReport("The fingerprint feature set was created.")
                        Enroller.AddFeatures(Features_Enrol)
                    Finally
                        SetStatus("Fingerprint Templates Remaining: " & Enroller.FeaturesNeeded.ToString)
    
                        Select Case Enroller.TemplateStatus
                            Case DPFP.Processing.Enrollment.Status.Ready 'Report success and stop capturing
                                RaiseEvent OnTemplate(Enroller.Template)
                                StopCapture()
                                SetStatus("Fingerprint Templates Completed. Save now....")
    
                            Case DPFP.Processing.Enrollment.Status.Failed 'Report failure and restart capturing
                                Enroller.Clear()
                                StopCapture()
                                RaiseEvent OnTemplate(Nothing)
                                StartCapture()
                        End Select
                    End Try
                End If
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
        End Sub
    
        'Template Verify
        Private Sub Process_Verify(ByVal Sample As DPFP.Sample)
            Try
    
                DrawPicture(ConvertSampleToBitmap(Sample))
    
                Dim Features_Verify As DPFP.FeatureSet = Extract_Features(Sample, DPFP.Processing.DataPurpose.Verification)
                Dim Verificator As New DPFP.Verification.Verification
                Dim result As New DPFP.Verification.Verification.Result()
    
                If Not Features_Verify Is Nothing Then 'Check quality of the sample if it's good
                    Dim fs As MemoryStream = New MemoryStream
                    Dim fs_bytes As Byte()
    
                    Dim obj As New cQryExec
                    Dim qry As String = "Select FingerImpr From [TableName] Where ID = '[PersonID]' And isThumb = 1"
                    Dim dset As New DataSet
    
                    dset = obj.ReturnDSet(qry)
    
                    If dset.Tables(0).Rows.Count > 0 Then
                        fs_bytes = dset.Tables(0).Rows(0).Item("FingerImpr")
                        fs = New IO.MemoryStream(fs_bytes)
    
                        Dim Saved_Template As New DPFP.Template(fs)
    
                        Verificator.Verify(Features_Verify, Saved_Template, result)
                    End If
    
                    If result.Verified Then
                        MakeReport("The fingerprint was VERIFIED.")
                    Else
                        MakeReport("The fingerprint was NOT VERIFIED.")
                    End If
                End If
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
        End Sub
    
        'Save -------------------------------------------------------------------------------------------------------------
        Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
            Try
    
                If Enroller.FeaturesNeeded > 0 Then
                    MessageBox.Show("'Insufficient Templates'." & vbCrLf & Enroller.FeaturesNeeded.ToString & "  more 'Fingerprint' scans needed.", MsgHeader, MessageBoxButtons.OK, MessageBoxIcon.Information)
                    Exit Sub
                End If
    
                Dim obj As New cQryExec
    
                Dim fs As MemoryStream = New MemoryStream
                Enroller.Template.Serialize(fs)
    
                fs.Position = 0
                Dim br As BinaryReader = New BinaryReader(fs)
                Dim fs_bytes() As Byte = br.ReadBytes(CType(fs.Length, Int32))
    
                Dim cmd As SqlCommand = New SqlCommand("Update [TableName] Set FingerImpr = @FingerImpr Where ID = '[PersonID]'", mycon)
                cmd.Parameters.Add("@FingerImpr", SqlDbType.Image).Value = fs_bytes
    
                If mycon.State = ConnectionState.Closed Then
                    mycon.Open()
                End If
    
                cmd.ExecuteNonQuery()
    
                If mycon.State <> ConnectionState.Closed Then
                    mycon.Close()
                End If
    
    
                MessageBox.Show("'Fingerprint' Templates Saved successfully.", MsgHeader, MessageBoxButtons.OK, MessageBoxIcon.Information)
                btnClose_Click("", System.EventArgs.Empty)
    
            Catch ex As Exception
                ErrMsg(ex, GetCurrentMethod.Name)
            End Try
        End Sub
    
    End Class
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多