Autor Tema: Biomini Slim SFU-S20  (Leído 3025 veces)

0 Usuarios y 1 Visitante están viendo este tema.

9tnix

  • Bit
  • Mensajes: 2
  • Reputación: +0/-0
    • Ver Perfil
Biomini Slim SFU-S20
« en: Noviembre 17, 2016, 12:26:27 pm »
Hola amigos

Hace poco cayo el lector de huellas Suprema BioMini Slim SFU-S20 en mis manos pero esto de los arrays se me complica y queria su apoyo, resulta que tengo una bd en postgres y tengo guardados imagenes como texto de huellas digitales y queria hacer el match entre la huella que captura el lector y las huellas que saco de la bdatos.

Según el sdk es simple como esto

Código: [Seleccionar]

' Assume template size is 1024 bytes

Const MAX_TEMPLATE_SIZE As Long = 1024
Dim ufm_res As UFM_STATUS
Dim hMatcher As Long
Dim Template1(MAX_TEMPLATE_SIZE - 1) As Byte
Dim Template2(MAX_TEMPLATE_SIZE - 1) As Byte
Dim Template1Size As Long
Dim Template2Size As Long
Dim VerifySucceed As Long

 
' Create hMatcher

' Get two templates, Template1 and Template2
'Se debe tener 2 arrays de bytes con los datps de la huella y el tamaño de cada array para hacer la comparacion
ufm_res = UFM_Verify(hMatcher, Template1(0), Template1Size, Template2(0), Tempalte2Size, VerifySucceed)

If (ufm_res = UFM_STATUS.OK) Then
' UFM_Verify is succeeded
If (VerifySucceed = 1) Then
' Template1 is matched to Template2
Else
' Template1 is not matched to Template2
End If

Else
     ' UFM_Verify is failed
' Use UFM_GetErrorString function to show error string
End If


La descripcion de los parametros

Parameters
hMatcher:              [in] Handle of the matcher object
pTemplate1           [in] Pointer to the template
nTemplate1Size     [in] Specifies the size of the template
pTemplate2           [in] Pointer to the template array
nTemplate2Size     [in] Specifies the size of the template array
bVerifySucceed      [out] Receives whether verification is succeed; 1: verification is succeed, 0: verification is failed


Este es el codigo que estoy haciendo

Código: [Seleccionar]
  Const MAX_TEMPLATE_SIZE As Long = 1024
  Dim lHuella_bd(MAX_TEMPLATE_SIZE -1) as byte '// Array de bytes de la huella en la bd
  Dim lHuella(MAX_TEMPLATE_SIZE -1) as byte   '// Array de bytes de la huella del lector
  Dim lHuella_tam as long                       '// Tamaño de huella
  Dim lHuella_bd_tam as long                 '// Tamaño de huella en la bd
  Dim lBase64   As Base64Class             '// Convierte String a bytes y viceversa
  Dim lEmpleado As EN_Empleado          '// Registro de Empleado
  Dim lHPE      As Byte                             '// huellas por empleado
 
  'se asume que lHuella tiene el array del lector, eso si esta correcto

  Set lBase64 = New Base64Class
 
  '// Recorriendo la lista de empleados
  If m_empleados.TotalRegistros > 0 Then
    m_empleados.IrInicio
    lHPE = 2
    Do Until m_empleados.FinalRegistro
      Set lEmpleado = m_empleados.GetRegistro
      '// Obtiene la huella del dedo indice
      If lHPE = 2 Then
        '// Leo la huella que esta guardada como texto en la bd, esto lo convierte a array de bytes
        lHuella_bd = lBase64.DecodeToByteArray(lEmpleado.DedoIndice)   '<< aqui me sale el error no se puede asignar
        lHuella_bd_tam = UBound(lHuella_bd)
      Else
        lHuella_bd = lBase64.DecodeToByteArray(lEmpleado.DedoMedio)
        lHuella_bd_tam = UBound(lHuella_bd)
      End If
      '// Compara la huella que esta en el array ñHuella (del lector ) y lHuella_bd (huella del empleado en la bd)
      lUfm_res = UFM_Verify(m_hMatcher, lHuella(0), lHuella_tam, lHuella_bd(0), lHuella_bd_tam, lResultado)
      If lUfm_res <> UFM_STATUS.OK Then
        UFM_GetErrorString lUfm_res, m_strError
        MsgBox m_strError, vbCritical
        Exit Function
      Else
        If lResultado = 1 Then
          MsgBox "Resultado de Comparacion" & vbCrLf & _
                 "Empleado: " & lEmpleado.Nombre, vbInformation
          Exit Do
        End If
      End if
      lHPE = lHPE - 1
      If lHPE = 0 Then
        m_empleados.IrSiguiente
      End If
    Loop

Una mano amigos, alguien que haya usando este lector de huellas comparando estos arrays

Gracias de antemano
Salu2
« última modificación: Noviembre 17, 2016, 05:20:25 pm por 9tnix »

obethermy

  • Megabyte
  • ***
  • Mensajes: 116
  • Reputación: +6/-7
    • Ver Perfil
Re:Biomini Slim SFU-S20
« Respuesta #1 en: Noviembre 17, 2016, 09:07:02 pm »
Yo tengo otro lector de huellas. Lo primero que hago es probar la sdk. Luego adapto parte de los modulos a mi programa.
Yo probaria con una cadena de texto primero lHuella_bd = lBase64.DecodeToByteArray("huella") para ver si funciona o si la variable es de tipo texto(string) vartype(lEmpleado.DedoIndice).
Espero que te sirva

9tnix

  • Bit
  • Mensajes: 2
  • Reputación: +0/-0
    • Ver Perfil
Re:Biomini Slim SFU-S20
« Respuesta #2 en: Noviembre 18, 2016, 05:29:50 pm »
Hola obethermy

Gracias por responder, sobre el codigo

Código: [Seleccionar]
lHuella_bd = lBase64.DecodeToByteArray("huella")

Tanto lHuella_bd y lBase64.DecodeToByteArray son de tipo byte, el primero es un array de bytes con tamaño definido y el metodo DecodeToByteArray devuelve un array de bytes este lo uso para leer imagenes en la bd las imagenes guardadas como texto y no tengo problema alguno.
Aca con lo que no me funciona es cuando hago la comparación de huellas, estoy tratando de crear un array de bytes a partir de una string y pasarselo al array lHuella_bd.
lEmpleado.DedoIndice contiene una String de la imagen de la huella, y eso es lo que le paso a DecodeToByteArray(String)

Como podría hacer para que me devuelva en todo caso el array para una variable array que tiene un tamaño definido? y como obtengo el tamaño de un array como el que se necesita para compararlo con el otro array?

Código: [Seleccionar]
  Dim lHuella_bd(MAX_TEMPLATE_SIZE -1) as byte '// Array de bytes de la huella en la bd
  '....
 
  If lHPE = 2 Then
        '// Leo la huella que esta guardada como texto en la bd, esto lo convierte a array de bytes
        lHuella_bd = lBase64.DecodeToByteArray(lEmpleado.DedoIndice)   '<< aqui me sale el error no se puede asignar
        lHuella_bd_tam = UBound(lHuella_bd)
      Else
        lHuella_bd = lBase64.DecodeToByteArray(lEmpleado.DedoMedio)
        lHuella_bd_tam = UBound(lHuella_bd)
      End If
      '// Compara la huella que esta en el array ñHuella (del lector ) y lHuella_bd (huella del empleado en la bd)
      lUfm_res = UFM_Verify(m_hMatcher, lHuella(0), lHuella_tam, lHuella_bd(0), lHuella_bd_tam, lResultado)
    '....


obethermy

  • Megabyte
  • ***
  • Mensajes: 116
  • Reputación: +6/-7
    • Ver Perfil
Re:Biomini Slim SFU-S20
« Respuesta #3 en: Noviembre 18, 2016, 10:54:29 pm »
recordando
Un bit tiene un único valor, un 1 o un 0, no es posible representar caracteres con un único bit.
Un byte son 8 bits, o sea, lo suficiente para representar 1 caracter
Un kilobyte, son 1024 bytes, es decir 1024 caracteres.

 UBound(lHuella_bd) 'Devuelve el mayor subíndice disponible para la dimensión indicada de una matriz o sea 1024

obethermy

  • Megabyte
  • ***
  • Mensajes: 116
  • Reputación: +6/-7
    • Ver Perfil
Re:Biomini Slim SFU-S20
« Respuesta #4 en: Noviembre 18, 2016, 11:01:22 pm »
Las matrices de bytes son un tanto especial porque Visual Basic le permite asignar directamente las cuerdas a ellos. En este caso, Visual Basic realiza una copia de memoria directa de los contenidos de la cadena. Debido a que todos Básica 5 y 6 cuerdas visuales son cadenas Unicode (dos bytes por carácter), la matriz de destino se redimensiona para tener en cuenta la longitud de cadena real en bytes (que se puede determinar mediante la función LenB  pero la descontinuaron). Si la cadena contiene sólo caracteres cuyo código está en el rango de 0 a 255 (el caso si se trabaja con alfabetos latinos), cada dos bytes de la matriz será 0:

Dim b () As Byte, Text As String
Text = "123"
b () = Text  'Ahora b () contiene seis items: 49 0 50 0 51 0

También es posible realizar la operación opuesta:

Text = b ()

'NOTA:. Esta función podría no funcionar con alfabetos no latinos

Function CountSpaces(Text As String) As Long
Dim b() As Byte, i As Long
b() = Text
For i = 0 To UBound(b) Step 2
' Considere sólo los elementos numerados impares.
' Ahorra tiempo y código utilizando el nombre de la función como una variable local.
If b(i) = 32 Then CountSpaces = CountSpaces + 1
Next
End Function

la matriz que tienes es estatica
tendras que hacer una funcion contador para saber cuantos valores hay en la matriz

LeandroA

  • Administrador
  • Petabyte
  • *****
  • Mensajes: 1128
  • Reputación: +151/-8
    • Ver Perfil
Re:Biomini Slim SFU-S20
« Respuesta #5 en: Noviembre 19, 2016, 02:06:21 am »
perdón que me meta pero porque probas no declaras así

Código: [Seleccionar]
Dim lHuella_bd() as byte '// Array de bytes de la huella en la bd
en ves de

Código: [Seleccionar]
Dim lHuella_bd(MAX_TEMPLATE_SIZE -1) as byte '// Array de bytes de la huella en la bd

obethermy

  • Megabyte
  • ***
  • Mensajes: 116
  • Reputación: +6/-7
    • Ver Perfil
Re:Biomini Slim SFU-S20
« Respuesta #6 en: Noviembre 19, 2016, 11:40:51 am »

lBase64.DecodeToByteArray es una funcion  no estara puesta como Base64.DecodeToByteArray


NEBIRE

  • Kilobyte
  • **
  • Mensajes: 57
  • Reputación: +7/-1
    • Ver Perfil
Re:Biomini Slim SFU-S20
« Respuesta #7 en: Noviembre 29, 2016, 10:13:54 pm »
De entrada hay varias cosas que pueden estar fallando...

Primero empezaría por remplazar la función... lBase64.DecodeToByteArray. VB6 tiene su propia función y es fácil de usar:

Código: [Seleccionar]
Dim Mes as string
Dim M() as byte

Mes="Noviembre"
M= Strconv(mes, vbFromUnicode)  ' ya tienes el array de bytes en M.

Citar
tengo guardados imagenes como texto de huellas digitales
Ahora bien, como te decía eso es solo el principio... Yo veo tu mayor problema en esto, que te cito...

Ya que como dices: estás usando una cadena de texto para almacenar las huellas,  es casi seguro, que se está generando alguna conversión indeseada, por ejemplo si aparece un byte 0 (Chr(0)), la cadena se trunca y acaba ahí, donde encuentra el ASCII nº 0. Ya que esa es la especificón de final de una cadena (BSTR), que acaba en chr(0). Y siendo una imagen me temo que tendrá muchos bytes 0, de hecho el negro es RGB: 0,0,0 el Rojo es RGB: 255,0,0  etc... etc...

Debes guardar las imágenes como arrays de bytes... o perderás información (que es fijo, lo que te está pasando).

Y para terminar, si tienes que comparar dos arrays, no necesitas llamar a una función de una dll, puedes hacerla tú en tu propio código:

Código: [Seleccionar]
public function Compara2Arrays(byref Ar1() as byte, byref Ar2() as byte) as boolean
     dim SizeAr as long, k as long

     SizeAr = Ubound(Ar1)   ' se supone que el array empieza en índice 0
     If (SizeAr= Ubound(Ar2) ) then
           For k=0 To SizeAr
                if (Ar1(k)<> Ar2(k)) then exit function ' si falla un solo byte los arrays son distintos (quizás esté la imagen girada 90º, espejada, etc...) y quizás el análisis de huella deba tener cierta tlerancia de diferencia, no de 1 solo byte...
          Next
          Compara2Arrays= True
    ' else  ' si son de tamaño diferente los arrays, ya no son iguales, luego no hace falta comparar nada más.
     end if
end function
« última modificación: Noviembre 29, 2016, 10:21:52 pm por NEBIRE »