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

Delphius 19-02-2008 14:27:15

Hola connor,
Lamentablemente a tu pregunta, solo existe una respuesta: a nivel de base de datos NO.

Lo que estás buscando debe hacerse a mano, a menos que exista una biblioteca que realize esto.

El mayor problema de esto es interpretar correctamente que se entiende por FindKey o Nearest en una imagen.

Por algo decíamos que lo más lógico sería hacer una "transformación" de dicha imagen en una clave y hacer las comparaciones por medio de esa clave.

La idea es:
1. Leer la imagen a buscar
2. Calcular su valor clave
3. Realizar la comparación de dicho valor clave con las almacenadas en la base de datos

Un inconveniente es la imagen que se desea buscar. Si esta se ve afectada o distorcionada por luces y sombras es probable que el valor "clave" sea errado con lo que se desea buscar.

¿Cuando dos imagenes son similares? ¿Cuando tienen un margen de diferencia de un 10%?¿Que contienen las imágenes?

¿Cual es tu verdadero propósito de esto?

En los sistemas de reconocimiento, lo que se guarda no es la imagen, sino una representación numérica... y para predecir o determinar si una nueva imagen pertenece a dicho conjunto se aplican funciones matemáticas relativamante complejas.

¿Las imágenes son distintas unas a otras?¿Tienen algo en común?¿Un objeto, una cara?

Si cada imagen es distinta a otra, su clave lo sorá... implementar SHA, o algunos de esos te podría resultar.

Ahora bien... si tus imágenes obeceden cierto patrón (por ejemplos las caras en los sistemas de reconocimiento facial) lo cual llevaría a distinguir
a un objeto dentro del resto... necesariamente necesitas de otro enfoque. Un enfoque que requiere de sentarse a investigar correctamente. Como he dicho... aqui ya es necesario saber de matemática, mejor dicho algebra.

Por tus otras dudas, te pido que lo trates en otro hilo. No viene al caso tratarse aquí ya que no tiene que ver con la temática. Esto está clamarente dicho en la guia de estilo: respete por favor el tema tratado en el hilo. Preguntas nuevas, hilos nuevos.

Saludos,


La franja horaria es GMT +2. Ahora son las 14:40:09.

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