Page 1 of 1

Comparar dos JPG

Posted: Wed Apr 25, 2007 4:15 pm
by Biel EA6DD
Hola a todos,
se os ocurre alguna manera rapida para comparar dos graficos(JPG,BMP, da igual), y detectar diferencias de un a otro.

Posted: Wed Apr 25, 2007 5:24 pm
by Antonio Linares
Biel,

Si los gráficos estan en formatos diferentes, la solución sería seleccionar cada uno en un hDC distinto y comparar pixel a pixel sus colores

Si lo que deseas es sólo comparar dos ficheros con igual extension, podrías calcular el CRC de cada uno de ellos y comparar los CRCs.

Posted: Thu Apr 26, 2007 6:44 am
by Biel EA6DD
Hola Antonio,
los graficos son con el mismo formato, lo del CRC lo habia estado pensando como una posibilidad, pero quizas sea mas interesante el comparar pixel a pixel, pues así podria tener un porcentaje de smilitud y no solo igual o diferente.

Estoy algo perdido con el tema, como podria hacer una lectura pixel a pixel, comparando el color.

Posted: Thu Apr 26, 2007 8:01 am
by Antonio Linares
Biel,

Code: Select all

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 )

DeleteDC( hDC ) 

// Aqui comparas los pixeles
for n = 1 to nHBmp1
   for m = 1 to nHBmp1
      if GetPixel( hDCMem1, n, m ) != GetPixel( hDCMem2, n, m )
         MsgInfo( "son distintos" )
      endif
   next
next

SelectObject( hDCMem1, hOldBmp1 ) 
DeleteDC( hDCMem1 )
SelectObject( hDCMem2, hOldBmp2 ) 
DeleteDC( hDCMem2 )
Lo suyo sería pasar este código a C para que vaya más rápido

Posted: Thu Apr 26, 2007 2:30 pm
by Biel EA6DD
Perfecto, gracias Antonio.

Es justo lo que necesitaba, un pelin lento para lo que lo quiero, pero intentare pasarla a C , o no evaluar todos los pixels. Realmente busco similitud, y no es critico pixel arriba pixel abajo.

Muchas gracias.

Posted: Thu Apr 26, 2007 5:09 pm
by toninhofwi
Hi.

If you need to compare two JPG files, try this:

if HB_MD5File(cFile1) == HB_MD5File(cFile2)
? "equal"
endif


Toninho.

Posted: Fri Apr 27, 2007 7:03 am
by Biel EA6DD
Hi Toninho, thanks for your help. HB_MD5File() will be helpfull to find diferences between files.

But I will use pixel by pixel compare, because I want to know not just equal, also want to know similar.

Posted: Fri Apr 27, 2007 7:14 am
by Biel EA6DD
Gracias Antonio, con un pequeño retoque ya tengo la función haciendo justo lo que queria.

La utilizo con una camara IP, y lo que hago es detecar movimiento en la camara para disparar el sistema de grabación.

Le he añadido dos parametros, precision (pixels a evaluar), y similitud (para detectar diferencias entre colores). La funcion retorna el porcentaje de diferencia entre las dos imagenes.
Gracias por la ayuda.

Posted: Fri Apr 27, 2007 7:30 am
by Antonio Linares
Biel,

Me alegro que te haya servido :-)

Posted: Tue May 22, 2007 2:56 pm
by Biel EA6DD
Hola Antonio,
en el ejemplo de codigo que has puesto, para que sirven las variables hOldBmb1, y hOldBmp2. Estoy intentando pasar la funcion a c, y estas variables parece que no las usamos, o no alcanzo a ver en que se usan.

Gracias anticipadas.

Posted: Wed May 23, 2007 2:40 pm
by Willi Quintana
Hola Biel,
Interesante el tema, usar una web cam para vigilancia y otras cosillas mas,,, pregunto, si por compraracion de imagenes, se activa el modo grabacion video, como se cancela la grabacion??, es decir en forma automatica?

Salu2

Posted: Wed May 23, 2007 4:24 pm
by Biel EA6DD
Hola Willi
pues de la misma manera que se activa. Cada x _ una imagen, la comparo con la anterior, y me devuelve un porcentaje de cambio. Si la grabacion esta activa, y el porcentaje de moviento es inferior al humbral que tengo definido para activar la grabación, se detiene la grabacion.
Image

Posted: Wed May 23, 2007 4:37 pm
by Antonio Linares
Biel,

Siempre que se usa SelectObject() hay que guardar el valor que devuelve que es el objeto GDI previamente seleccionado, para restaurarlo como estaba, al final

Posted: Wed May 23, 2007 4:43 pm
by Biel EA6DD
Antonio,
gracias maestro. No me habia percatado de las ultimas lineas de la función. Tendre que estudiarme mas profundamente el funcionamiento de GDI.

Posted: Wed May 23, 2007 5:40 pm
by Antonio Linares
Biel,

Enhorabuena por tu aplicación de captura de imágenes, está espectacular :-)