2011-04-28 20 views
6

¿Pueden darme pistas sobre cómo encontrar una imagen en la pantalla? Quiero decir, una simple combinación de píxeles. Por ejemplo, encuentra coordenadas de 30x30 píxeles cuadrados blancos.Java encuentra la imagen en la pantalla

La clase de robot de Java me permite encontrar el color de cierto píxel. Pero necesito hacer lo contrario, quiero que mi programa escanee mi pantalla y luego me diga las coordenadas de esta pequeña imagen. Bueno, podría pasar todos los píxeles con Robot, pero debería ser más rápido que eso. Mucho mas rápido.

¿Alguna sugerencia?

Respuesta

4

Bueno, podría recorrer todos los píxeles con Robot, pero debería ser más rápido que eso. Mucho mas rápido.

Me temo que eso es precisamente lo que tendrás que hacer.

Si todos los píxeles deben ser blancos, primero puede tomar pasos de 30 píxeles de ancho y si encuentra un píxel blanco, por ejemplo, 5 pasos de píxeles, y si estos también son blancos, examine los píxeles restantes en el cuadrado .

Algo como esto:

.  .  .  .  .  . 



.  ..........  .  .  . 
     ...... 
     . . . . 

     . . . . 
.  .  .  ..........  . 
          .......... 
          .......... 
          .......... 
          .......... 
.  .  .  .......... 
+0

pero ¿qué tan rápido sería? Me gusta utilizarlo para obtener un buen puntaje en un juego ... pero pasar por todos esos ... ¿no lo procesa para siempre? – Jaanus

+1

Pruébalo. Lo hice una vez para un tetris bot ... funcionó bien (aunque escanear un campo de tetris parece un poco más fácil que tu situación). – aioobe

+1

Depende de lo inteligente que pueda ser al respecto. Puede haber formas de hacer cosas como una forma de búsqueda binaria, o podría haber varios accesos directos que podría tomar. Por ejemplo, desea encontrar un cuadrado blanco de 30x30 píxeles, lo que significa que si el píxel actual no es blanco, puede saltar 30 píxeles sin riesgo de perder el cuadrado. Todo depende de lo que esperas que sea en pantalla. – Doug

4

En realidad, hay una gran parte simpliler o solución más fiable para esto. Puede implementar las bibliotecas Sikuli dentro de su aplicación Java para detectar elementos de imagen en su pantalla e interactuar con ellos. Estaba destinado a automatizar las pruebas de UI, pero creo que puede satisfacer sus necesidades con bastante facilidad.

Ejemplo de aplicación (source):

import java.net.MalformedURLException; 
import java.net.URL; 

import org.sikuli.api.*; 
import org.sikuli.api.robot.Mouse; 
import org.sikuli.api.robot.desktop.DesktopMouse; 
import org.sikuli.api.visual.Canvas; 
import org.sikuli.api.visual.DesktopCanvas; 

import static org.sikuli.api.API.*; 

public class HelloWorldExample { 

    public static void main(String[] args) throws MalformedURLException { 

      // Open the main page of Google Code in the default web browser 
      browse(new URL("http://code.google.com")); 

      // Create a screen region object that corresponds to the default monitor in full screen 
      ScreenRegion s = new DesktopScreenRegion(); 

      // Specify an image as the target to find on the screen 
      URL imageURL = new URL("http://code.google.com/images/code_logo.gif");     
      Target imageTarget = new ImageTarget(imageURL); 

      // Wait for the target to become visible on the screen for at most 5 seconds 
      // Once the target is visible, it returns a screen region object corresponding 
      // to the region occupied by this target 
      ScreenRegion r = s.wait(imageTarget,5000); 

      // Display "Hello World" next to the found target for 3 seconds 
      Canvas canvas = new DesktopCanvas(); 
      canvas.addLabel(r, "Hello World").display(3); 

      // Click the center of the found target 
      Mouse mouse = new DesktopMouse(); 
      mouse.click(r.getCenter()); 
    } 
} 

Véase también How to use Sikuli inside your Java programs para la configuración.

+0

Estoy un poco confundido. Estás utilizando clases que encuentro en sikuli-standalone.jar que descargué del sitio de code.google, y que tienen documentación sobre code.google .... Pero el enlace que publicas parece referirse a otro sikuli que tiene un conjunto diferente de clases Descargué ambas bibliotecas. El que usa funciona bien, pero es difícil encontrar HOWTOs. El otro tiene una mejor documentación (ha publicado un enlace), pero no funciona en absoluto. Estoy realmente confundido, ¿hay dos tipos de sikuli, o qué? Gracias. – Marko

+0

No recuerdo bien, pero creo que solo compartí el enlace en la parte inferior con el propósito de instalar/configurar Sikuli para usar en sus proyectos Java. Probablemente solo sea relevante hasta el paso 5, no seguiría el código de muestra que se muestra allí. Probablemente deberías estar siguiendo la documentación en code.google. ¿Qué exactamente no está funcionando? Para ser sincero, no he intentado usar Sikuli con Java directamente, solo con JRuby. Pero si funciona para JRuby no veo por qué no debería funcionar con Java. – Noz

+0

sikuli-standalone **. Jar funciona bien para mí (el que descargué de code.google), y también encuentro buenos ejemplos sobre cómo usar sus clases. Entonces todo está bien ahora. Solo tenía curiosidad si hay dos tipos de sikuli. – Marko

Cuestiones relacionadas