Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: 9tnix 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
' 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
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
-
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
-
Hola obethermy
Gracias por responder, sobre el codigo
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?
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)
'....
-
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
-
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
-
perdón que me meta pero porque probas no declaras así
Dim lHuella_bd() as byte '// Array de bytes de la huella en la bd
en ves de
Dim lHuella_bd(MAX_TEMPLATE_SIZE -1) as byte '// Array de bytes de la huella en la bd
-
lBase64.DecodeToByteArray es una funcion no estara puesta como Base64.DecodeToByteArray
-
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:
Dim Mes as string
Dim M() as byte
Mes="Noviembre"
M= Strconv(mes, vbFromUnicode) ' ya tienes el array de bytes en M.
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:
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