SoloCodigo

Programación General => Visual Basic 6.0 e inferiores => Mensaje iniciado por: riciar en Martes 21 de Diciembre de 2004, 14:25

Título: Ocx Visual Basic
Publicado por: riciar en Martes 21 de Diciembre de 2004, 14:25
Necesito saber como hacer para reconocer un objeto o una imagen dentro de un PictureBox.
Título: Re: Ocx Visual Basic
Publicado por: Brroz en Martes 21 de Diciembre de 2004, 14:47
Hola riciar.

¿A qué te refieres cuando dices 'reconocer'?¿Tendrías que reconocer un objeto (supongo que te refieres a un control contenido en él) o la imagen?

Intenta concretar más. Chao.
Título: Re: Ocx Visual Basic
Publicado por: RadicalEd en Martes 21 de Diciembre de 2004, 15:17
SERIA COMO EL RECONOCIMIENTO DE IMAGENES, LO QUE HACEN CON LOS ROSTROS DE LOS MAS BUSCADOS DE LA POLICIA?
ALGO ASI, CREO YO
Título: Re: Ocx Visual Basic
Publicado por: riciar en Lunes 27 de Diciembre de 2004, 13:15
Brozz gracias por contestar.
Lo que quiero hacer es encontrar una imagen patron dentro de otra, por ejemplo en un picture box tengo un mouse que lo uso de patron y el programa lo tiene que encontrar dentro de otro picture box donde hay varios objetos incluido el mouse.
Si tienes algo que me ayude te lo agradeceria.
Título: Re: Ocx Visual Basic
Publicado por: Brroz en Lunes 27 de Diciembre de 2004, 18:10
Hola riciar.

La forma que se me ocurre para resolver esto puede hacerse lenta y consumidora de recursos, pero...

En principio dices que tienes cierta imagen que debes usar como patrón para localizarla posteriormente. Ok, yo almacenaría esa imagen en una matriz de 'Ancho , Alto dimensiones' (o si lo prefieres de una dimensión Ancho x Alto) de tipo Long. A continuación mediante un bucle recorrería la imagen patrón 'escaneando' el valor de cada punto y asignando su color al respectivo punto de la matriz. Para averiguar el color de cada punto usa la función Point.

A continuación recorre la imagen que quieres comparar buscando la coincidencia con los correspondientes elementos de la matriz. Una vez que encuentres coincidencia con el primer elemento, continua comprobando puntos hasta el ancho del patrón. Si en algun momento deja de haber coincidencia, continúa con el escaneo, si no, al llegar al ancho del patrón, comprueba una nueva línea comenzando en la fila que coincidió de primera.

No sé si no me habré embrollado un poco explicando esto último, pero seguro que tomas la idea rápidamente. Ánimo que implementar esto no debe ser complicado (otra cosa es que el resultado pueda ser exasperantemente lento).

Te pondría un código de ejemplo, pero es que ahora en breve me voy a casa. Si tal y tienes dificultades en otro momento hablamos.

Chau.
Título: Re: Ocx Visual Basic
Publicado por: Cyclop en Lunes 27 de Diciembre de 2004, 20:32
Seria mejor convertirlo a imagen de 16bits y de ahi hacer la busqueda

Salu2
Título: Re: Ocx Visual Basic
Publicado por: Brroz en Martes 28 de Diciembre de 2004, 09:40
Hola Cyclope.

Podría no funcionar el reconocimiento por alguna posible pérdida de color...¿no?

Para optimizar desde luego que lo mejor sería copiar las imagenes a bitmaps compatibles seleccionados en un DC para luego comprobar el DC y así evitar trabajar directamente en el control.

También podría ser interesante usar C, por ejemplo, y no VB, pero...

Chao.
Título: Re: Ocx Visual Basic
Publicado por: riciar en Martes 28 de Diciembre de 2004, 13:08
Hola Brozz.
OK esa forma estaria buena, intentare a ver que pasa.
Por otro lado buscando en todos los foros encontre a un tal Gandalf el gris o algo asi, que en una discucion menciono que habia hecho programas para reconocer caras, pero no se como comunicarme con el, seguire intentando.

Hasta luego.
Título: Re: Ocx Visual Basic
Publicado por: Brroz en Martes 28 de Diciembre de 2004, 17:28
Para intentara hablar con Gandalf_malaga7:

http://foros.solocodigo.com/index.php?showuser=5708 (http://foros.solocodigo.com/index.php?showuser=5708)

Donde dice algo así como 'Correo          pincha aquí', pos eso, pincha ahí.
También puedes probar con un mensaje personal, aunque si hace tiempo que no estra por aquí, pues...

Chao.
Título: Re: Ocx Visual Basic
Publicado por: Jeshu en Viernes 28 de Septiembre de 2007, 05:37
Mmmm.... holas , soy nueva en este foro y en estos momentos me encuentro en aprietos, ya que necesito saber como comparo elementos dentro de un arreglo; por si alguien no entiende genere un arreglo de 1 a 15 con numeros en su interior, la cosa es que dentro del arreglo hay numeros que se repiten y este arreglo tiene que ser con numeros del 1 al 25 todos distitos.... Si alguien me puede ayudar seria excelente....


Besos...
Título: Re: Ocx Visual Basic
Publicado por: ezequielminor en Martes 2 de Octubre de 2007, 00:18
para comparar los elementos de un arreglo solo basta con recorrerlo y compararlo con el 2do arreglo . por ejemplo

dim MiArreglo(15) as string
dim Numero as integer, i as integer
dim Coincidencias as integer
Numero = 0
Coincidencias = 0

For i = 0 to 15
 For Numero = 0 to 15
    if Numero = MiArreglo(i) Then
    Coincidencias = Coincidencias + 1
    End If
         If Coincidencias > 1 Then
         MsgBox("Se Repite el numero" & Numero)
  Next Numero
Next i

no estoy muy seguro de su funcionamiento, cuando vuelva  a tener contacto con mi computadora , te traigo un codigo fuente  :hola:
Título: Re: Ocx Visual Basic
Publicado por: Jeshu en Martes 2 de Octubre de 2007, 20:55
Muchas gracias, algo asi es  lo que necesitaba...

Besos.....
Título: Re: Ocx Visual Basic
Publicado por: Nebire en Viernes 5 de Octubre de 2007, 06:42
Cita de: "Brroz"
Hola riciar.

La forma que se me ocurre para resolver esto puede hacerse lenta y consumidora de recursos, pero...

En principio dices que tienes cierta imagen que debes usar como patrón para localizarla posteriormente. Ok, yo almacenaría esa imagen en una matriz de 'Ancho , Alto dimensiones' (o si lo prefieres de una dimensión Ancho x Alto) de tipo Long. A continuación mediante un bucle recorrería la imagen patrón 'escaneando' el valor de cada punto y asignando su color al respectivo punto de la matriz. Para averiguar el color de cada punto usa la función Point.

A continuación recorre la imagen que quieres comparar buscando la coincidencia con los correspondientes elementos de la matriz. Una vez que encuentres coincidencia con el primer elemento, continua comprobando puntos hasta el ancho del patrón. Si en algun momento deja de haber coincidencia, continúa con el escaneo, si no, al llegar al ancho del patrón, comprueba una nueva línea comenzando en la fila que coincidió de primera.

No sé si no me habré embrollado un poco explicando esto último, pero seguro que tomas la idea rápidamente. Ánimo que implementar esto no debe ser complicado (otra cosa es que el resultado pueda ser exasperantemente lento).

Te pondría un código de ejemplo, pero es que ahora en breve me voy a casa. Si tal y tienes dificultades en otro momento hablamos.

Chau.
aunque es eficaz es una forma lenta, demasiado lenta, por de pronto se me ocurre como ganarle velocidad usando el mismo algoritmo que describes. Lo comento:

Se supone que la coincidencia de patrón es igual, ya que si no es preciso usar otro algoritmo.
Lo 1º indicar que la API getPixel es más rápida... que point.

 Cuando encuentras una coincidencia del primer punto de la 1ª línea, lo que debes hacer no es buscar el siguiente, sino x siguientes más allá si también aparece, ahora busca x líneas más abajo, es decir hallnado 1 coincidencia marcas buscar dos coincidencias más en un área cuadrada (los 3 puntos deben formar un triángulo), si hay éxito comprueba nuevamente otros 3 puntos en distancias aleatorias , la probabilidad de que sean exactos es muy baja (salvo que haya pocos colores, es decir un patrón con poco contraste, mucho brillo, etc...), si el nuevo triángulo coincide, entonces examínalo desde principio a fin de corrido como indicas, si falla el 2º triángulo, el primero o tan sólo el 2º punto, fíjate que con sólo 2,3 ó 6 puntos puedes descartar un área cuadrada... sin necesidad de recorrerla punto a punto. entonces una imagen de pongamos 800x600 la puedes recorrer en apenas unos miliSg, frente a los varios segundos (10-30) que podría suponer revisar una imagen completa píxel a píxel con point.