Reconocer imágenes en pantalla - Robot Inteligencia Artifici

Robots la parte programada en el ordenador, cibernetica, autoguiado del pc, algoritmos, recursividad
Responder
godman
Mensajes: 2
Registrado: 15 Feb 2011, 23:32

Reconocer imágenes en pantalla - Robot Inteligencia Artifici

Mensaje por godman »

Hola soy nuevo en esto de Autoit, pero eso me gustaría saber si se puede hacer algo. Me gustaría hacer un bot que juegue al juego de explotar los globos. Para ello necesito identificar los globos en la ventana, elegir si pinchar en ellos o no. Por último cuando se acabe el juego reconocer el texto has ganado y hacer click en continuar. El juego no es un juego web. ¿Se puede hacer esto? Si se puede, decidme la funciones y ya me busco yo la vida :smt001
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Bot para juego

Mensaje por BasicOs »

Hola, buenas,
no necesitas buscarte la vida :smt003 :smt003 :smt002 , porque en el foro tienes de todo sobre el tema. También puedes buscar la palabra captcha o ocr.

Así por encima,
es con las funciones _Pixel que buscan un color o un trozo del globo en una zona de la pantalla que sería el globo, y las funciones MOuseclick() para pinchar en el.

Sería algo como

Código: Seleccionar todo

; Wait until something changes in the region 0,0 to 50,50

; Get initial checksum
$checksum = PixelChecksum(0,0, 50,50)
Vigilando si algun pixel cambia en una zona:
; Wait for the region to change, the region is checked every 100ms to reduce CPU load
While $checksum = PixelChecksum(0,0, 50, 50)
  Sleep(100)
WEnd

MsgBox(0, "", "Something in the region has changed!")

y esta:

Código: Seleccionar todo

; Find a pure red pixel or a red pixel within 10 shades variations of pure red
$coord = PixelSearch( 0, 0, 20, 300, 0xFF0000, 10 )

If Not @error Then
    MsgBox(0, "X and Y are:", $coord[0] & "," & $coord[1])
   mouseclick() en las coordenadas anteriores
EndIf
Puedes mezclar las dos, primero buscando el color y luego la mezcla de colores(checksum)

Si quieres recorrer la pantalla pixel a pixel un ejemplo (aunque ya hay funciones echas que lo hacen)

Código: Seleccionar todo

for $i=1 to resoluciondepantalla del  eje x
  for $j=1 to resoluciondepantalla del eje y
  if encuentrocolordeglobo() then mouseclick() en las coordenadas
  next
next
Aquí estamos por ayudar a ser honestos con los otros jugadores en los juegos, pero si quieres hacerte el reto de fabricar un programa que siempre funcione bien para lo que quieres, seguro que gastás más en fabricarlo que en ganar el juego, pero puedes vencer a la máquina con ingenio y buscarle la vuelta y aprender de paso.
Si deseas publicar el código puedes hacerlo cuando lo tengas, :smt024 :smt024 :smt024 :smt034 :smt034
Aquí hay algún ejemplo:
http://www.emesn.com/autoitforum/viewto ... =20&t=2112
Salu22:)
Edit:
En Youtube tienes algunos ejemplos:
Aquí comentan sobre la diferencia de velocidad entre C++ y Autoit al buscar Pixeles, comentan que es poca diferencia con una máquina normal:
http://www.youtube.com/watch?v=Gl3brW22XNs
godman
Mensajes: 2
Registrado: 15 Feb 2011, 23:32

Re: Bot para juego

Mensaje por godman »

Muchisimas gracias, creo que esto es lo que busacaba!

Edito: Lo hago para aprender. De hecho el juego de los globos sobre el que lo voy a probar lo hice yo. Pero quiero aprender a hacer este tipo de cosas, creo que resultan interesantes. Cuando lo tenga acabado (y si funciona ^^!) publico el código :smt002
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Reconocer imágenes en pantalla - Robot Inteligencia Arti

Mensaje por BasicOs »

Ejemplo resumido de como buscar y reconocer imagenes en zonas de la pantalla, comparandolas con otras imágenes almacenadas en un .txt en formato checksum. Esto es válido para inteligencia artificial o cuando vamos a operar con pantallas de "bajo nivel" como java, flash, consolas remotas, y otras ventanas que dan problemas de identificación para su control.

Comentado en español.

Código: Seleccionar todo

; Localizador de imágenes - Basicos de autoit.es Comentarios 
#include <file.au3>
; localizo el nombre de la ventana de un programa por su título en settings.ini 
Global $browserTitle = IniRead(@ScriptDir & "\settings.ini","Browser","browser_title","")
;cargo la array de la tabla de checksums de las imagenes. Esto se almaceno previamente guardando valores de imágenes con la función Checksum.
Global $sTableChecksums = StringSplit(FileRead('..\data\table.txt'),',')
HotKeySet("{ESC}", "_exit")

; Función que busca si la imagen de un programa se encuentra en la tabla y devuelve una tabla array con las coordenadas de donde se encontró

$aPositiondelatablaQuecoincideConelTxt=Find_Table()

;================ la función que hace la tarea
Func Find_Table($iStart=0)
Local $aPosition[2]
$Path = @ScriptDir & "\newtablechecksum.txt"
;localiza las coordenadas de la ventana que nos interesa
Local $aWinPos = WinGetPos($browserTitle)
If IsArray($aWinPos) And $aWinPos[2] And $aWinPos[0]>0 Then
 If $iStart==0 Then 
   $iStart = $iStart+$aWinPos[1]
 EndIf
;busca si hay un pixel concreto como pista inicial para seguir chequeando, bien en la ventana específica o bien en todo full screen en general..
$aSearch = PixelSearch($aWinPos[0],$iStart,$aWinPos[2],$aWinPos[3], 0x364C63);
Else
$aSearch = PixelSearch(0,$iStart,@DesktopWidth,@DesktopHeight, 0x364C63);
EndIf

If @error <> 0 Then ; hay un error de localización del PixelSearch
;_Log('WARNING - table color not found on screen')
Return $aPosition
EndIf
;ahora que sabemos que Pixelsearch ha encontrado una señal de un color, grabamos ese trozo de pantalla en una variable checksum 
$iChecksum = PixelChecksum($aSearch[0]-1,$aSearch[1]-1,$aSearch[0],$aSearch[1])

If $iStart==0 Then _FileWriteLog($Path,'try these checksums')
_FileWriteLog($Path, $aSearch[0] & 'x' & $aSearch[1] & ' - ' & $iChecksum)
MouseMove($aSearch[0],$aSearch[1],10)
Sleep(1000)
; va revisando en todos los checksums archivados en el .txt previo, por si hay alguno igual, es decir si la imagen es la misma.
For $i = 1 to $sTableChecksums[0]
  If $iChecksum==Int($sTableChecksums[$i]) Then ;si coincide la imagen con las del .txt graba la posición
    $aPosition[0] = $aSearch[0]
    $aPosition[1] = $aSearch[1]
  EndIf
Next
; si no hay igualdad sigue buscando recursivamente moviendo un pixel la localización
If Not $aPosition[0] Then
$aPosition = Find_Table($aSearch[1]+1)
EndIf
Return $aPosition
EndFunc

Func _exit()
Exit
EndFunc

Salu22:)
PD: Este es un programa elemental de Inteligencia artificial, si alguien lo aplica y quiere mostrarlo podemos ver una aplicación para un caso concreto, por ejemplo ver si una página de flash/video muestra una imagen, etc..
En formato coloreado sin comentarios:
borraya1.jpg
borraya1.jpg (91.62 KiB) Visto 14706 veces
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Reconocer imágenes en pantalla - Robot Inteligencia Arti

Mensaje por Jonny »

Puf... :).

Yo nunca he entendido como hacer un OCR o reconocer imágenes con las funciones pixel de AutoIt.
Supongo, que hay que ir buscando cambios, pero digamos, programando la forma de lo que se busca... ¿no?.

Si por ejemplo se busca un círculo, habrá que buscar cambios en los píxeles, en forma de círculo.
¿Es así?.

Si es así, lo veo mega-complicado! ;).

Y luego no termino de entender, como buscar cambios por ejemplo de color.
Como hacer un OCR, por ejemplo. Supongo, que para eso, habría que buscar los carácteres, basándose en un contraste de color, del carácter respecto al fondo.
¿Cómo se hace con las funciones pixel?. Creo recordar que buscan un color en un píxel, pero no un color sobre otro ¿o sí?.

Salu2!
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Reconocer imágenes en pantalla - Robot Inteligencia Arti

Mensaje por BasicOs »

nO ES tan complicado ya que hay "motores" OCR ya creados que solo tienes que pasarles las imágenes y te dan el resultado en letras. Un círculo sería una O depende...

Lo de buscar imágenes es algo diferente, es buscar por ejemplo un icono de un programa, o un enemigo u objetivo en un juego (un monstruo), o bien una carta de poker que está perfilada, o bien un mensaje de java en una resolución, etc...


Otra cosa es buscar colores, que pueden servir de inicio para luego buscar una imagen, si sabemos que el borde de una imagen es de un color podemos iniciar la comparación del checksum con la imagen completa (tambien se puede hacer solo los checksums pixel a pixel por toda la pantalla, pero puede tardar más.

Si quieres busca color sobre color sería un if anidado como
con las funciones Pixel

Código: Seleccionar todo

While verde 
 ;ahora busco el siguiente color 2 pixeles más hacia la derecha o hacia abajo
   if rojo then
      msgbox(0,"busqueda","color Rojo despues de verde aquí")
      exitloop
   endif
wend 
Salu22:)
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Reconocer imágenes en pantalla - Robot Inteligencia Arti

Mensaje por Jonny »

¿Con "rojo después de verde" te refieres, a "rojo sobre verde"?. Osea, una línea roja (por ejemplo) sobre un fondo verde (por ejemplo). Eso es lo que no entiendo, como hacer con las funciones pixel. ¿Se supone que un pixel de la pantalla puede tener un color sobre otro ¿no?.

Bueno. Me he expresado mal, creo. Me refería a imágenes, porque el post va de buscar imágenes, pero para mi buscar carácteres es lo mismo que buscar un monstruo en un juego... (en cuanto a lo técnico se refiere).
¿Como buscas una "d" en la pantalla, o en una ventana, un área concreta de la pantalla...?.

Imagino que de la misma forma que un monstruo ¿no? ;). Porque las funciones Pixel no te buscan la "d", has de ingeniártelas con ellas, para encontrarlas... Así, que supongo que habría que buscar píxeles en forma de "d" ¿no?.

Bueno; me refería a hacer el OCR con autoIt, que se ha hablado por aquí que sería posible, muchas veces.... por supuesto que es más fácil coger uno ya hecho y usarlo con AutoIt, pero luego, encontrar uno gratuito y realmente bueno es bastante difícil...

Aprovechando el tema (de robótica) en el que estamos, a mi me gustaría hacer un soft, que mediante una cámara que capture la imagen de la pantalla del pc, fuera capaz de leer lo que pone en ella: que hay seleccionado, etc.
Como si fuera un humano ¡y como una segunda fase, que fuera capaz de interactuar con el PC!.

Ya hablé de ello hace tiempo, cuando preguntaba como hacer un OCR con la cámara del PC.
Bueno, no dije cual era la idea exactamente (creo), porque en un principio, iba a ser demasiado :).

Salu2!
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Reconocer imágenes en pantalla - Robot Inteligencia Arti

Mensaje por BasicOs »

un pixel de la pantalla NO puede tener un color sobre otro, ES de un color determinado en la escala en sí, pero puede ser que se pase de un color a otro cambiando de pixel.

LO que tu quiers está hecho aquí funcionando con incluso un video, cambia la marca roja en la mano, y pon una pantalla con una tarjeta roja (por ejemplo), y en vez del brazo robot pon tu script que ejecuta lo que deseas...

http://www.emesn.com/autoitforum/viewto ... =19&t=2180

No necesitas usar OCR, puedes usar TARJETAS DE COLORES, u otros códigos similares, y luego te garantizo, que si poco a poco vas perfeccionandolo, puedes reconocer formas sencillas, y luego más complejas como caras o simbolos de texto.

Aquí ves en el video que reconoce como se cambia el color de lo que se ve en cámara, al poner la mano delante se produce un cambio de los pixeles que recibe, entonces ejecuta un script quereconoce como se está conectado a un brazo que se mueve
es decir:
if cambio de color en los pixeles THEN ejecuta un programa/script
:

que mediante una cámara que capture la imagen de la pantalla del pc, fuera capaz de leer lo que pone en ella: que hay seleccionado, etc.
Como si fuera un humano ¡y como una segunda fase, que fuera capaz de interactuar con el PC!
Puedes ver mucho mas aqui:
una imagen sobre otra:
http://www.emesn.com/autoitforum/viewto ... =20&t=2215

Puedes mira este para entradas y respuestas-salidas,
http://www.emesn.com/autoitforum/viewto ... =19&t=2052


http://www.emesn.com/autoitforum/viewto ... =19&t=2052
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Reconocer imágenes en pantalla - Robot Inteligencia Arti

Mensaje por Chefito »

Yo te recomiendo que mires este ejemplo que hice no hace mucho: http://www.emesn.com/autoitforum/viewto ... 509#p14241
Es de un bot para un juego web. Reconoce dos tamaños de cuadrados. Simplemente tienes que pensar el algoritmos más rápido y mejor para hacer este tipo de reconocimientos.
Si te falla, comenta estas líneas:

Código: Seleccionar todo

         $play=PixelGetColor(321,240,$hwndJuego)
         $DeadPixel=PixelGetColor(290,78,$hwndJuego)
         If $play=16711422 And $deadpixel=39578 Then   ;si los pixeles son los de la palabra podeis darle al botón "PLAY" y empezar la partida.
            ControlClick($Gui,"","MacromediaFlashPlayerActiveX1","left",1,321,240)
            Sleep(20)
Si lo copias tal cual, serían de la línea 38 a la 42. Por supuesto tienes que comentar también el cierre del if (endif), el cual se encuentra en la línea 154, al final, el último endif.
Si haces estas modificaciones le tienes que dar al botón "play (jugar)", después de haberle dado a la palabra play de color blanco que te aparece para jugar.
Igual que se puede reconocer estas figuras simples, se podría hacer con letras, aunque esto sería mucho más largo y difícil, pero no imposible :smt002 .
Lo que sí sería muy difícil es hacer un ocr por ejemplo de catchas tipo el de google. Y si me pusiese y por casualidad lo consiguiese, no creo que publicase el código, ya que sería muy demandado :smt005 . Puede incluso que hablase con los de google y les mostrase un vídeo de como resolvería los catchas para intentar negociar con ellos :smt002 . Pero ni se me pasa por la cabeza ponerme con ello, ya que lo veo excesivamente complicado :smt024 :smt021 .

Saludos.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Reconocer imágenes en pantalla - Robot Inteligencia Arti

Mensaje por BasicOs »

Un reconocedor ocr de caras, mide la distancia entre los ojos, ojos y boca, y pelo, y crea un FACEID que sirve para identificar y comparar con una en vivo con cual de ellas es la detectada de las almacenadas :smt017 :smt017 :

http://www.autoitscript.com/forum/topic ... th-webcam/

y una udf para meter la webcam en un gui: http://www.autoitscript.com/forum/topic ... ebcam-udf/

Salu22:)
EDIT
OCR
http://www.autoitscript.com/forum/topic ... try1036762
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2091
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Reconocer imágenes en pantalla - Robot Inteligencia Arti

Mensaje por BasicOs »

Aquí hay un OCR creado identificando patrones de cambios de colores/formas, también hay más ejemplos allí (usar el google translate para inglés).

La lógica del programa en el post 4, la resumo en esta sencilla frase:
Pixelsearch analiza cada uno de los píxeles de la primera línea vertical y comprobar si cada pixel es de un color que contraste con el color de fondo (especificada como $ BKC) los colores en tonos $ rad se consideran fondo 'background'.
En el mismo tópico ingles.Tambien hay un programador que creó alguna función (con pcs más antiguos) para mejorar la velocidad y que hizo un identificador de imágenes para un juego (Runscape).

Esto lo publico porque hay muchas cuestiones sobre programas que no dejan reconocer los identificadores de los controles directamente, (java, juegos, etc..), y otros que necesitan OCR para identificar formas en pantalla. Seguir aquí la aplicación a la robótica. Aquí está el otro hilo para reconocer juegos, flash, java

Salu22:)
Responder