Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Tablas planas (https://www.clubdelphi.com/foros/forumdisplay.php?f=20)
-   -   Busqueda por IMAGEN (https://www.clubdelphi.com/foros/showthread.php?t=53045)

RebeccaGL 08-02-2008 16:12:00

Busqueda por IMAGEN
 
Alguein sabe como puedo hacer una busqueda por imagen, foto.

Ejemplo ingreso determinada foto y que el sistema realize la busqueda como cualquier otro campo y encuentre las concurrencias.

Saludos.

Neftali [Germán.Estévez] 08-02-2008 16:49:30

Tal vez deberías guardar un "CRC" de la foro y buscar por el campo de CRC en lugar del de la foto. Similar a como se calcula un CRC o un MD5 de un archivo.
Lo que ahora mismo no se me ocurre es cómo calcular ese CRC/MD5.

enecumene 08-02-2008 21:12:30

Y que tal haciendo comparaciones de imagenes, aqui una solucion dada por seoane:

http://www.clubdelphi.com/foros/show...92&postcount=8

y esta otra por Delphius:

http://www.clubdelphi.com/foros/showthread.php?t=41549

Saludos.

Delphius 08-02-2008 21:19:45

Cita:

Empezado por enecumene (Mensaje 264464)
Y que tal haciendo comparaciones de imagenes, aqui una solucion dada por seoane:

http://www.clubdelphi.com/foros/show...92&postcount=8

Saludos.

El problema de emplear ese método es que no es viable en una tabla. Sobre todo si debe buscarse entre 1000 o 100000 imágenes.

Ese código explora toda la imagen a lo largo y ancho. Y reiterar el proceso demasiadas veces consume mucho tiempo.

La mejor técnica consiste en lo que dice Neftali, tener un valor clave o identificador a cada imagen. Este identificador puede obtenerse cuando se carga la imagen.

EDITO:
Ese hilo que abri Neftali solo sirve si se emplea DUnit. DUnit es una herramienta CASE que sirve para generar casos de prueba. No otra cosa. Si empleas DUnit sirve para poner a prueba tus módulos, tus funciones y otras cosas.

A los fines prácticos lo que comenta Neftali es la opción recomendada.

Saludos,

enecumene 08-02-2008 21:32:27

Vale, pues sabes entonces de alguna manera como obtener el valor CRC de la imagen, con el perdon del amigo connor si me entrometo, pero ahora este tema me ha llamado la atención, pues he estado pensando para un futuro proyecto donde tenga que ver con la busqueda de imagenes y comparaciones.

Saludos.

Delphius 09-02-2008 00:17:58

Hola!

Algunas referencias a tener en cuenta:

CRC
MD5
Hash , Sha, Md5 - Página de seoane

Para mayor detalles buscar entre los hilos de seoane.

Saludos,

enecumene 11-02-2008 14:18:47

Cita:

Empezado por Delphius (Mensaje 264497)
Hola!

Algunas referencias a tener en cuenta:

CRC
MD5
Hash , Sha, Md5 - Página de seoane

Para mayor detalles buscar entre los hilos de seoane.

Saludos,

Vale muy interesantes, gracias amigo Delphius, cuando esté con mas calma le daré una revisada, de nuevo gracias.

Saludos.

Delphius 11-02-2008 17:45:40

Hoy me encontraste un poco inspirado y mi mente medio un ejemplo sencillo de lo que podría ser un algoritmo generador de clave.

No tiene mucha seguridad, ni nada por el estilo... Creería que funcionaría siempre y cuando las imagenes sean muy diferentes. Habría que probar.

La idea que tuve es recorrer la imagen y ponderar los valores RGB según su posición.

El algoritmo que concebí es como sigue:

Código Delphi [-]
function TForm1.GenerarClave(Image: TPicture): integer;
var i,j,k: integer; // coordenadas para movernos por la imagen
                    // k para movernos sobre el canal RGB
    sum, sum_rgb: integer; // suma
    RGB: ^TRGB;
    Bmp: TBitmap;
begin
  if not (Image.Graphic is TBitmap)
     then begin
            Bmp:= TBitmap.Create;
            try
              Bmp.Width:= Image.Width;
              Bmp.Height:= Image.Height;
              Bmp.Canvas.Draw(0,0,Image.Graphic);
              Image.Assign(Bmp);
            finally
              Bmp.Free;
            end;
          end;
  Image.Bitmap.PixelFormat := pf24bit;
  sum := 0;
  for j := 0 to Image.Bitmap.Height - 1 do
    begin
      RGB := Image.Bitmap.ScanLine[j];
      sum_rgb := 0;
      for i := 0 to Image.Bitmap.Width - 1 do
        begin
          // calcular suma RGB
          for k := 1 to 3 do
            sum_rgb := sum_rgb + RGB^[k];
          // vamos guardando las sumas ponderadas en funcion del eje x
          sum_rgb := sum_rgb + (sum_rgb * (i + 1));
          inc(RGB);
        end;
      // volvemos a ponderar la suma, ahora en funcion del eje y
      sum := sum + ((sum + sum_rgb) * (j + 1));
    end;
   result := sum;
end;

siendo TRGB la siguiente estructura:

Código Delphi [-]
TRGB = array[1..3] of byte;

Y un ejemplo de su uso:

Código Delphi [-]
ShowMessage(IntToSTr(GenerarClave(Image1.Picture)));

Como notarás, es un algoritmo demasiado simple... y la clave que genere dependerá mucho del tamaño de la imagen. Pues, cuanto más grande sea, más alto será el valor conseguido.
Si tu deseas obtener un algoritmo que genere claves de un determinado tamaño podría refinarse...

Es tan sólo otra alternativa a tener en cuenta si es que los algoritmos y las fuentes que te pasé te resultan un tanto complicadas.

Puede que otros foristas den un aporte alternativo y/o que esta función sea de base para conseguir algo un poco más elaborado y menos complicado que un RCR, MD5, Hash, etc.

Saludos,

mamcx 11-02-2008 17:53:32

Pues a menos que quieras una equivalencia EXACTA ninguno de los metodos anteriores te va a servir.

Sin embargo, quieres buscar el contenido BINARIO o quieres simplemente buscar informacion de la imagen? Porque en lo segundo es muy simple: nombre, fecha, atributos, etc.. son cadenas de texto.

Existen algoritmos especiales para buscar imagenes pero ya son otro cuento.

enecumene 11-02-2008 17:56:50

Vaya, veo que si estas inspirado hoy, una pregunta, si se calcula la de una imagen varias veces se genera una misma clave?

Saludos.

mamcx 11-02-2008 17:58:15

Una variacion de un bit alterara la clave. Solo serviria para una coincidencia exacta.

enecumene 11-02-2008 18:00:56

Cita:

Empezado por mamcx (Mensaje 264926)
Una variacion de un bit alterara la clave. Solo serviria para una coincidencia exacta.

Gracias mamcx, entonces como hago la comparación exacta de una imagen, o sea como consigo el valor binario de esa imagen?

SAludos.

Delphius 11-02-2008 18:10:59

Cita:

Empezado por mamcx (Mensaje 264922)
Pues a menos que quieras una equivalencia EXACTA ninguno de los metodos anteriores te va a servir.

Sin embargo, quieres buscar el contenido BINARIO o quieres simplemente buscar informacion de la imagen? Porque en lo segundo es muy simple: nombre, fecha, atributos, etc.. son cadenas de texto.

Existen algoritmos especiales para buscar imagenes pero ya son otro cuento.

¿A que te refieres con que no va a servir?

Haz dicho algo clave, tal vez con sólo fijarse en los atributos basta. Pero si es que realmente se desea tener un identificador único para cada imagen, hay que tener un buen algoritmo. Porque los atributos podrían cambiarse, mientras que la imagen puede ser la misma (o bastante similar)

Cita:

Empezado por enecumene (Mensaje 264925)
Vaya, veo que si estas inspirado hoy, una pregunta, si se calcula la de una imagen varias veces se genera una misma clave?

Saludos.

El algoritmo está pensado para devolver siempre la misma clave si es que se suministra la misma imgen. No posee aleatoriedad. El valor de la clave depende del contenido de la imagen, por lo que si se pasa A, se obtendrá siempre la clave A.

Como dije, necesitaría análisis, pues por más que otra imagen sea distinta no se garantiza que se obtendrá un valor distinto. Es por ello que para impedir ciertas similitudes, pondero las sumas. Pero no esto no es suficiente. Por ejemplo, si la suma da 300 y la ponderación es 60, es lo mismo que si la suma es 60 y la ponderación sea 300. ¿Se entiende?

No es un algoritmo demasiado fuerte. Pero puede que sea de utilidad para comenzar.

Saludos,

enecumene 11-02-2008 18:14:35

Vale, se entiende perfectamente, solo me queda sacar un tiempo para ver si lo puedo aplicar en el proyecto. De nuevo gracias amigo Delphius.

Saludos

mamcx 12-02-2008 17:17:33

Si estas buscando una coincidencia exacta, metele un hash MD5 o un SHA.

Si quieres una excelente libreria de todo estos temas:

http://sourceforge.net/projects/openstrsecii/

Es la version open source de http://www.streamsec.com/products_strsectools.asp y me consta que el autor es un genio de estos temas.

Chris 12-02-2008 18:00:38

Este tema está muy interesante. Sin embargo, el compañero connor no ha especificado si lo que intenta hacer es buscar una imagen "dentro de la DB", en otras palabras, buscar una existencia exacta de la imagen, que para esto ya todos los compañeros han posteado códigos muy útiles.

Por otro lado, la intención de connor puede ser buscar imágenes similares, el su post original, menciona "foto" esto me hace suponer que andará buscando algún tipo de reconocimiento facial o algo por el estilo. Si es este el caso, de solo imaginarlo, es algo demasiado difícil y te recomenzaría que paralelamente consultes a google a ver que ayuda puedas encontrar.

Cualquiera que sea tu propósito, te recomiendo que apliques la sugerencia de neftalí.

Saludos.

Delphius 12-02-2008 18:15:00

Cita:

Empezado por D&W (Mensaje 265259)
Este tema está muy interesante. Sin embargo, el compañero connor no ha especificado si lo que intenta hacer es buscar una imagen "dentro de la DB", en otras palabras, buscar una existencia exacta de la imagen, que para esto ya todos los compañeros han posteado códigos muy útiles.

Por otro lado, la intención de connor puede ser buscar imágenes similares, el su post original, menciona "foto" esto me hace suponer que andará buscando algún tipo de reconocimiento facial o algo por el estilo. Si es este el caso, de solo imaginarlo, es algo demasiado difícil y te recomenzaría que paralelamente consultes a google a ver que ayuda puedas encontrar.

Cualquiera que sea tu propósito, te recomiendo que apliques la sugerencia de neftalí.

Saludos.

Es cierto, lo que dice connor en esas pocas líneas parece ser que se desea hacer algo como reconocimiento.
Si ese es el caso, que se prepare porque el problema es complejo. Si no sabré yo:D:p:o.

No es fácil sentarse y comprender el tema. Pues en realidad lo que se desea y se guarda en estos sistemas es una representación numérica de las imagenes. Para ser exacto un numerito de obedece a ciertas propiedades del algebra matricial (que es el corazón y la base donde descansa todo el sistema).

Palabra clave en estos asuntos: EigenFace, FisherFace. Y si, lamentablemente debe consultar en Google (o su buscador favorito) y preparse con el inglés porque en castellano hay poco y nada. Y me animo a decir que en incluso en inglés no hay demasiado que urgar.

Saludos,

Neftali [Germán.Estévez] 12-02-2008 19:01:36

Cita:

Empezado por D&W (Mensaje 265259)
...el compañero connor no ha especificado si lo que intenta hacer es buscar una imagen "dentro de la DB", en otras palabras, buscar una existencia exacta de la imagen

:confused::confused::confused::confused:

Cita:

Empezado por enecumene (Mensaje 264929)
...entonces como hago la comparación exacta de una imagen..


Delphius 14-02-2008 04:48:47

¿connor no va a aparecer para dar su opinión?:confused:
No veo interés de su parte con el hilo.

Si bien ya muchos estamos coincidiendo con el hecho de que usar SHA, Hash, MD5 o alguno de esos son útiles en estos casos, seria oportuno que connor volviera y ofrezca su punto de vista del asunto.

Saludos,

RebeccaGL 19-02-2008 13:49:31

Gracias por las aportaciones son muy interesantes. Si lo que deseo es hacer busquedas en un Table.DB

Por ejemplo tengo una tabla con campos como: codigo, nombres imagen, la idea es hacer busquedas por el campo imagen tendria tambien que indexar por el campo imagen, digamos ingreso una imagen cargandola del disco duro o ingresandola por un scanner. presionar un boton y que el sistema busque las coherencias asi como se hace con Table1.FindKey ó Table1.Nearest, pero en este caso lo haga con la imagen, con busquedas exactas y parciales, se podra hacer eso?.

Saludos


La franja horaria es GMT +2. Ahora son las 13:24:24.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi