来自数据库的数字角色指纹验证不起作用


   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();

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

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;
    }
}

Integração com Digital Persona 4500 Fingerprint

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:UsersGabrielDocumentsVisual Studio 2015ProjectsProjeto_Fisioativa_DesktopProjeto_Fisioativa_Desktop2Bd_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.");
            }
        }
    }
                        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;
                            }
                        }

我这样做了,希望这个帮助(完整的工作解决方案) 数字角色一键式 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

相关内容

  • 没有找到相关文章

最新更新