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.
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