![:smt001](./images/smilies/001.gif)
Reconocer imágenes en pantalla - Robot Inteligencia Artifici
Reconocer imágenes en pantalla - Robot Inteligencia Artifici
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](./images/smilies/001.gif)
![:smt001](./images/smilies/001.gif)
- BasicOs
- Site Admin
- Mensajes: 2083
- Registrado: 21 Nov 2006, 19:24
- Ubicación: El Internet - (Canarias, España)
- Contactar:
Re: Bot para juego
Hola, buenas,
no necesitas buscarte la vida
, 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
y esta:
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)
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,
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
no necesitas buscarte la vida
![:smt003](./images/smilies/003.gif)
![:smt003](./images/smilies/003.gif)
![:smt002](./images/smilies/002.gif)
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!")
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
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
Si deseas publicar el código puedes hacerlo cuando lo tengas,
![:smt024](./images/smilies/024.gif)
![:smt024](./images/smilies/024.gif)
![:smt024](./images/smilies/024.gif)
![:smt034](./images/smilies/034.gif)
![:smt034](./images/smilies/034.gif)
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
Re: Bot para juego
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](./images/smilies/002.gif)
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](./images/smilies/002.gif)
- BasicOs
- Site Admin
- Mensajes: 2083
- Registrado: 21 Nov 2006, 19:24
- Ubicación: El Internet - (Canarias, España)
- Contactar:
Re: Reconocer imágenes en pantalla - Robot Inteligencia Arti
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.
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:
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
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:
Re: Reconocer imágenes en pantalla - Robot Inteligencia Arti
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!
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!
- BasicOs
- Site Admin
- Mensajes: 2083
- Registrado: 21 Nov 2006, 19:24
- Ubicación: El Internet - (Canarias, España)
- Contactar:
Re: Reconocer imágenes en pantalla - Robot Inteligencia Arti
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
Salu22:)
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
Re: Reconocer imágenes en pantalla - Robot Inteligencia Arti
¿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!
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!
- BasicOs
- Site Admin
- Mensajes: 2083
- Registrado: 21 Nov 2006, 19:24
- Ubicación: El Internet - (Canarias, España)
- Contactar:
Re: Reconocer imágenes en pantalla - Robot Inteligencia Arti
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
:
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
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
:
Puedes ver mucho mas aqui: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!
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
- 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
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:
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
.
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
. 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
. Pero ni se me pasa por la cabeza ponerme con ello, ya que lo veo excesivamente complicado
.
Saludos.
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 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](./images/smilies/002.gif)
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](./images/smilies/005.gif)
![:smt002](./images/smilies/002.gif)
![:smt024](./images/smilies/024.gif)
![:smt021](./images/smilies/021.gif)
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 ;).
- BasicOs
- Site Admin
- Mensajes: 2083
- Registrado: 21 Nov 2006, 19:24
- Ubicación: El Internet - (Canarias, España)
- Contactar:
Re: Reconocer imágenes en pantalla - Robot Inteligencia Arti
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
:
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
![:smt017](./images/smilies/017.gif)
![:smt017](./images/smilies/017.gif)
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
- BasicOs
- Site Admin
- Mensajes: 2083
- Registrado: 21 Nov 2006, 19:24
- Ubicación: El Internet - (Canarias, España)
- Contactar:
Re: Reconocer imágenes en pantalla - Robot Inteligencia Arti
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:
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:)
La lógica del programa en el post 4, la resumo en esta sencilla frase:
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).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'.
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:)