【问题标题】:Java find image on screenJava在屏幕上查找图像
【发布时间】:2011-04-28 20:05:20
【问题描述】:

你们能给我一些关于如何在屏幕上找到图像的提示吗?我的意思是,一个简单的像素组合。例如,它会找到 30x30 像素的白色正方形的坐标。

Java 机器人类允许我找到某个像素的颜色。但我需要相反,我希望我的程序扫描我的屏幕,然后告诉我这个小图像的坐标。好吧,我可以用 Robot 遍历所有像素,但它应该比这更快。更快。

有什么建议吗?

【问题讨论】:

    标签: java image-processing


    【解决方案1】:

    实际上,有一个更简单或更可靠的解决方案。您可以在 Java 应用程序中实现 Sikuli 库来发现屏幕上的图像元素并与之交互。它旨在自动化 UI 测试,但我认为它可以很容易地满足您的需求。

    示例应用程序 (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());
         }
    }
    

    另请参阅How to use Sikuli inside your Java programs 进行设置。

    【讨论】:

    • 我有点困惑。您正在使用我在 sikuli-standalone.jar 中找到的类,这些类是我从 code.google 的网站下载的,并且在 code.google 上有文档...。但是您发布的链接似乎是指另一个具有不同集合的 sikuli类。我下载了两个库。您使用的那个工作正常,但很难找到 HOWTO。另一个有更好的文档(您发布了指向它的链接),但它根本不起作用。我真的很困惑,有两种类型的 sikuli,还是什么?谢谢。
    • 我不太记得了,但我想我分享底部的链接只是为了安装/设置 Sikuli 以在您的 Java 项目中使用。它可能只在第 5 步左右才有意义,我不会按照那里演示的示例代码进行操作。您可能应该关注 code.google 上的文档。究竟是什么不工作?老实说,我没有尝试直接将 Sikuli 与 Java 一起使用,仅与 JRuby 一起使用。但是如果它适用于 JRuby,我不明白为什么它不应该适用于 Java。
    • sikuli-standalone**.jar 对我来说很好用(我从 code.google 下载的那个),我还找到了关于如何使用它的类的很好的例子。所以现在一切都很好。我只是好奇是否有两种类型的 sikuli。
    【解决方案2】:

    好吧,我可以用 Robot 遍历所有像素,但它应该比这更快。更快。

    恐怕这正是你必须要做的。

    如果所有像素都应该是白色的,你可以先走 30 像素宽的步长,如果你找到一个白色像素,就走 5 像素步长,然后如果这些像素也是白色的,检查正方形中剩余的像素。

    类似这样的:

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

    【讨论】:

    • 但是它会有多快呢?我喜欢用它在游戏中获得好成绩..但是经历了所有这些..它不会永远处理它吗?
    • 试试看。我曾经为俄罗斯方块机器人做过一次......它工作得很好(即使扫描俄罗斯方块字段似乎比你的情况稍微容易一些)。
    • 取决于你的聪明程度。可能有一些方法可以做一些事情,比如二进制搜索,或者你可以采取各种捷径。例如,您想找到一个 30x30 像素的白色正方形,这意味着如果当前像素不是白色的,您可以安全地跳过 30 个像素而不会丢失正方形。这完全取决于您希望在屏幕上显示的内容。
    猜你喜欢
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    相关资源
    最近更新 更多