funcion para comparar dos bitmaps ?

funcion para comparar dos bitmaps ?

Postby albeiroval » Thu May 02, 2013 4:11 am

Hola foro,

Estoy probando como puedo comparar si dos huellas en archivos bmp se pueden comparar, para ver si son iguales,

Encontre este link donde hay una funcion en c++ que compara dos bitmaps pero no funciona llamandolo desde codigo prg,

Code: Select all  Expand view

http://www.rqna.net/qna/mnwyqx-compare-two-bitmap-device-context-file.html
 



Y aqui el codigo que estoy usando :

Code: Select all  Expand view

/////////////////////////////////////////////////////////////////////////////
//
//  CompareBitmaps
//    Compares two HBITMAPs to see if they contain the same image
//
//  Parameters :
//    HBitmapLeft  [in] : The HBITMAP handles that are to be compared
//    HBitmapRight [in] :
//
//  Returns :
//    true if the bitmaps are the same
//    false if they are different
//
/////////////////////////////////////////////////////////////////////////////


#include <hbapi.h>
#include <hbapiitm.h>
#include <winsock2.h>
#include <windows.h>
#include <string.h>

static bool CompareBitmaps(HBITMAP HBitmapLeft, HBITMAP HBitmapRight);

//-----------------------------------------------------------------------//

HB_FUNC( COMPAREBITMAPS )
{
    HBITMAP hBitmapLeft = (HBITMAP) hb_parnl(1);
    HBITMAP hBitmapRight= (HBITMAP) hb_parnl(2);
   
    if ( CompareBitmaps( hBitmapLeft, hBitmapRight ) )
         hb_retl( TRUE );
    else
         hb_retl( FALSE );   

}

//-----------------------------------------------------------------------//

static bool CompareBitmaps(HBITMAP HBitmapLeft, HBITMAP HBitmapRight)
{
if (HBitmapLeft == HBitmapRight)
{
 return true;
}

if (NULL == HBitmapLeft || NULL == HBitmapRight)
{
 return false;
}

bool bSame = false;

HDC hdc = GetDC(NULL);
BITMAPINFO BitmapInfoLeft = {0};
BITMAPINFO BitmapInfoRight = {0};

BitmapInfoLeft.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
BitmapInfoRight.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);

if (0 != GetDIBits(hdc, HBitmapLeft, 0, 0, NULL, &BitmapInfoLeft, DIB_RGB_COLORS) &&
 0 != GetDIBits(hdc, HBitmapRight, 0, 0, NULL, &BitmapInfoRight, DIB_RGB_COLORS))
{
 // Compare the BITMAPINFOHEADERs of the two bitmaps

 if (0 == memcmp(&BitmapInfoLeft.bmiHeader, &BitmapInfoRight.bmiHeader,
 sizeof(BITMAPINFOHEADER)))
 {
 // The BITMAPINFOHEADERs are the same so now compare the actual bitmap bits

 BYTE *pLeftBits = (BYTE*)hb_xgrab(sizeof(BYTE) * BitmapInfoLeft.bmiHeader.biSizeImage);
 BYTE *pRightBits = (BYTE*)hb_xgrab(sizeof(BYTE) * BitmapInfoRight.bmiHeader.biSizeImage);
 BYTE *pByteLeft = NULL;
 BYTE *pByteRight = NULL;

 PBITMAPINFO pBitmapInfoLeft = &BitmapInfoLeft;
 PBITMAPINFO pBitmapInfoRight = &BitmapInfoRight;

 // calculate the size in BYTEs of the additional

 // memory needed for the bmiColor table

 int AdditionalMemory = 0;
 switch (BitmapInfoLeft.bmiHeader.biBitCount)
 {
 case 1:
 AdditionalMemory = 1 * sizeof(RGBQUAD);
 break;
 case 4:
 AdditionalMemory = 15 * sizeof(RGBQUAD);
 break;
 case 8:
 AdditionalMemory = 255 * sizeof(RGBQUAD);
 break;
 case 16:
 case 32:
 AdditionalMemory = 2 * sizeof(RGBQUAD);
 }

 if (AdditionalMemory)
 {
 // we have to allocate room for the bmiColor table that will be

 // attached to our BITMAPINFO variables

 pByteLeft = new BYTE[sizeof(BITMAPINFO) + AdditionalMemory];
 if (pByteLeft)
 {
 memset(pByteLeft, 0, sizeof(BITMAPINFO) + AdditionalMemory);
 memcpy(pByteLeft, pBitmapInfoLeft, sizeof(BITMAPINFO));
 pBitmapInfoLeft = (PBITMAPINFO)pByteLeft;
 }

 pByteRight = new BYTE[sizeof(BITMAPINFO) + AdditionalMemory];
 if (pByteRight)
 {
 memset(pByteRight, 0, sizeof(BITMAPINFO) + AdditionalMemory);
 memcpy(pByteRight, pBitmapInfoRight, sizeof(BITMAPINFO));
 pBitmapInfoRight = (PBITMAPINFO)pByteRight;
 }
 }

 if (pLeftBits && pRightBits && pBitmapInfoLeft && pBitmapInfoRight)
 {
 // zero out the bitmap bit buffers

 memset(pLeftBits, 0, BitmapInfoLeft.bmiHeader.biSizeImage);
 memset(pRightBits, 0, BitmapInfoRight.bmiHeader.biSizeImage);

 // fill the bit buffers with the actual bitmap bits

 if (0 != GetDIBits(hdc, HBitmapLeft, 0,
 pBitmapInfoLeft->bmiHeader.biHeight, pLeftBits, pBitmapInfoLeft,
 DIB_RGB_COLORS) && 0 != GetDIBits(hdc, HBitmapRight, 0,
 pBitmapInfoRight->bmiHeader.biHeight, pRightBits, pBitmapInfoRight,
 DIB_RGB_COLORS))
 {
 // compare the actual bitmap bits of the two bitmaps

 bSame = 0 == memcmp(pLeftBits, pRightBits,
 pBitmapInfoLeft->bmiHeader.biSizeImage);
 }
 }

 // clean up
 hb_xfree(pLeftBits);
 hb_xfree(pRightBits);
 hb_xfree(pByteLeft);
 hb_xfree(pByteRight);
 }
}

ReleaseDC(NULL, hdc);

return bSame;
}

 


Alguien tendra una solucion diferente o alguna sugerencia ?


PDTA : Estube buscando la funcion en "c" de fivewin "ReadBitmap" para usuarla en codigo "c", el wiki dice que se encuentra en el archivo "..\source\winapi\bmpread.c" pero no lo encuentro !!


Desde ya muchas gracias,

Saludos,
Saludos,
Regards,

Albeiro Valencia
www.avcsistemas.com
User avatar
albeiroval
 
Posts: 363
Joined: Tue Oct 16, 2007 5:51 pm
Location: Barquisimeto - Venezuela

Re: funcion para comparar dos bitmaps ?

Postby Antonio Linares » Thu May 02, 2013 5:32 am

Si los dos bitmaps a comparar los mantienes en ficheros externos, podrias hacer:

MsgInfo( MemoRead( "bitmap1.bmp" ) == MemoRead( "bitmap2.bmp" ) )
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41408
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: funcion para comparar dos bitmaps ?

Postby albeiroval » Thu May 02, 2013 4:30 pm

Hola Antonio,

No funciono. (siempre da falso)

Saludos,
Saludos,
Regards,

Albeiro Valencia
www.avcsistemas.com
User avatar
albeiroval
 
Posts: 363
Joined: Tue Oct 16, 2007 5:51 pm
Location: Barquisimeto - Venezuela

Re: funcion para comparar dos bitmaps ?

Postby Antonio Linares » Thu May 02, 2013 6:13 pm

Albero,

Este ejemplo funciona bien aqui y muestra .T.

albero.prg
Code: Select all  Expand view
#include "FiveWin.ch"

function Main()

   MsgInfo( MemoRead( "albero.exe" ) == MemoRead( "albero.exe" ) )

return nil
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41408
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: funcion para comparar dos bitmaps ?

Postby albeiroval » Thu May 02, 2013 8:05 pm

Antonio,

Si funciona de esa manera. Lo que sucede es que no me hize entender .

Lo que necesito es lo siguiente :

Tengo un biometrico que me entrega un archivo bmp por cada lectura que haga, el primero lo guardo para compararlo con el nombre "compare.bmp",
Luego en las siguientes lecturas guardo los archivos con otros nombres.
Cuando hago el match de los dos bitmas ("compare.bmp" contra "otrofile.bmp") con la funcion MemoRead() me entrega siempre el valor de falso.
ahora si tomo cualquier archivo bitmap y lo comparo con el mismo me entrega verdadero.

Que otra opcion podria tener para realizar esa comparacion ?

gracias,
Saludos,
Regards,

Albeiro Valencia
www.avcsistemas.com
User avatar
albeiroval
 
Posts: 363
Joined: Tue Oct 16, 2007 5:51 pm
Location: Barquisimeto - Venezuela

Re: funcion para comparar dos bitmaps ?

Postby Antonio Linares » Thu May 02, 2013 8:12 pm

Lo que necesitas comparar es el contenido de esos dos bitmaps, si ? o solo los nombres ?

La forma de hacerlo con MemoRead() comprueba si no son idénticos.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41408
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: funcion para comparar dos bitmaps ?

Postby albeiroval » Thu May 02, 2013 9:15 pm

Necesito comparar el contenido de los dos bitmaps.

Los nombres no.
Saludos,
Regards,

Albeiro Valencia
www.avcsistemas.com
User avatar
albeiroval
 
Posts: 363
Joined: Tue Oct 16, 2007 5:51 pm
Location: Barquisimeto - Venezuela

Re: funcion para comparar dos bitmaps ?

Postby Antonio Linares » Thu May 02, 2013 10:26 pm

Si la comparación de los MemoRead()s the da falso entonces es que son distintos (aunque se vean igual, por dentro son distintos)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41408
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: funcion para comparar dos bitmaps ?

Postby Biel EA6DD » Tue May 07, 2013 8:14 am

En el caso de lecturar biométricas, no existen dos lecturas idénticas, sino similares. Lo que hacen los sofwares biometricos es guardan un patron de puntos, y en base a un porcentaje de acierto retornan cierto o verdadero.

Te adjunto un prototipo de una función que hice hace tiempo para comprobar similitudes entre ficheros bmp, esta integramente en Harbour + FW, tengo otra en C, pero esta te será más facil de manipular y adaptar a tus necesidades.
Code: Select all  Expand view

STATIC FUNCTION Compara(cBmpFile1,cBmpFile2,nPrecision,nDif)
   local hBmp1    := ReadBitmap( 0, cBmpFile1 )
   local hBmp2    := ReadBitmap( 0, cBmpFile2 )
   local hDC      := CreateDC( "DISPLAY",0,0,0 )
   local hDCMem1  := CreateCompatibleDC( hDC )
   local hDCMem2  := CreateCompatibleDC( hDC )
   local hOldBmp1 := SelectObject( hDCMem1, hBmp1 )
   local hOldBmp2 := SelectObject( hDCMem2, hBmp2 )
   local nWBmp1   := nBmpWidth( hBmp1 )
   local nHBmp1   := nBmpHeight( hBmp1 )
   local nWBmp2   := nBmpWidth( hBmp2 )
   local nHBmp2   := nBmpHeight( hBmp2 )
   LOCAL nPix:=0,n,m,i:=0
   LOCAL nRed1,nBlue1,nGreen1,nRgbColor1
   LOCAL nRed2,nBlue2,nGreen2,nRgbColor2
   DEFAULT nPrecision:=5
   DEFAULT nDif:=10
   DeleteDC( hDC )
   for n = 1 to nHBmp1 STEP nPrecision
      for m = 1 to nWBmp1 STEP nPrecision
         nRgbColor1:=GetPixel( hDCMem1, n, m )
         nRed1  :=nRgbRed(nRgbColor1)
         nBlue1 :=nRgbBlue(nRgbColor1)
         nGreen1:=nRgbGreen(nRgbColor1)
         nRgbColor2:=GetPixel( hDCMem2, n, m )
         nRed2  :=nRgbRed(nRgbColor2)
         nBlue2 :=nRgbBlue(nRgbColor2)
         nGreen2:=nRgbGreen(nRgbColor2)
         IF Abs(nRed1-nRed2)>nDif .OR. Abs(nGreen1-nGreen2)>nDif .OR. Abs(nBlue1-nBlue2)>nDif
            nPix++
         ENDIF
         i++
      next
   next
   DeleteObject(SelectObject( hDCMem1, hOldBmp1 ))
   DeleteDC( hDCMem1 )
   DeleteObject(SelectObject( hDCMem2, hOldBmp2 ))
   DeleteDC( hDCMem2 )
RETURN (nPix*100/i)
 
Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
User avatar
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca

Re: funcion para comparar dos bitmaps ?

Postby Antonio Linares » Tue May 07, 2013 9:16 am

Biel,

Muy interesante, gracias :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41408
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: funcion para comparar dos bitmaps ?

Postby hmpaquito » Tue May 07, 2013 11:15 am

Biel,

Es verdad, muy interesante tu aporte.

Una pregunta... ¿ Cual porcentaje de similitud puede ser el adecuado para validar como iguales dos huellas ?

Se me ocurre pensar, aunque no tengo ni idea, que quizás los comprobadores de huella utilicen búsqueda de patrones. Me explico. Por ejemplo, que busquen la distancia entre el primer y el último surco... no sé... ya digo que no tengo ni idea: cosas de ver mucho CSI.

Saludos a todos.
hmpaquito
 
Posts: 1482
Joined: Thu Oct 30, 2008 2:37 pm

Re: funcion para comparar dos bitmaps ?

Postby albeiroval » Tue May 07, 2013 1:26 pm

Biel,

Lo pruebo y te comento,

Gracias,

Saludos,
Saludos,
Regards,

Albeiro Valencia
www.avcsistemas.com
User avatar
albeiroval
 
Posts: 363
Joined: Tue Oct 16, 2007 5:51 pm
Location: Barquisimeto - Venezuela

Re: funcion para comparar dos bitmaps ?

Postby Biel EA6DD » Tue May 07, 2013 1:52 pm

hmpaquito wrote:Una pregunta... ¿ Cual porcentaje de similitud puede ser el adecuado para validar como iguales dos huellas ?

Se me ocurre pensar, aunque no tengo ni idea, que quizás los comprobadores de huella utilicen búsqueda de patrones. Me explico. Por ejemplo, que busquen la distancia entre el primer y el último surco... no sé... ya digo que no tengo ni idea: cosas de ver mucho CSI.

Saludos a todos.

El porcentaje, ni idea. Eso sera cuestión de prueba y error e ir afinando el porcentaje. Esta fución la desarrolle para detectar movimiento en videovigilancia, pero imagino que puede servir para lo que pedian.

En cuanto a biometria, con los lectores que yo he trabajo efectivamente, el SDK guarda un patron numérico cuyo algoritmo desconozco, toman n puntos de la huella para generarlo teniendo en cuenta lineas, y relieve de la misma.
Saludos desde Mallorca
Biel Maimó
http://bielsys.blogspot.com/
User avatar
Biel EA6DD
 
Posts: 682
Joined: Tue Feb 14, 2006 9:48 am
Location: Mallorca


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 29 guests