Java 上的 Sikuli 无法识别图像

Posted

技术标签:

【中文标题】Java 上的 Sikuli 无法识别图像【英文标题】:Sikuli on Java does not recognize images 【发布时间】:2021-12-23 00:52:49 【问题描述】:

我一直在尝试使我的计算机上的一些任务自动化,并且确实从 Java 中选择了 Sikuli 来这样做(我每天都使用 Java,并且不知道任何使用 java 的自动化工具,sikuli 是我发现的第一个)。我使用 java 和 maven 和 eclipse 作为 IDE。我已将 Sikuli 添加为 Maven 依赖项。

<dependency>
    <groupId>com.sikulix</groupId>
    <artifactId>sikulixapi</artifactId>
    <version>2.0.5</version>
</dependency>

我尝试做一些简单的事情。我使用 Windows 的屏幕截图工具对屏幕的某些部分进行了截图,并希望 sikuli 将其悬停。它对一张图像效果很好,但对其他图像则完全不行。似乎图像越大效果越好,因为我对任何小图像都没有成功。一个工作是整个窗口的屏幕(减少到我屏幕的~1/4)。 我还尝试在此窗口中找到一个按钮,找到左下角的 windows 徽标,找到我的包资源管理器的屏幕,但都无法正常工作。

我使用不同的值使用了similar(),但它并没有改善结果。在某些情况下(窗口内的按钮),它确实找到了一些低相似值的结果,但它是另一个按钮。奇怪的是:它找到了另一个亮蓝色的按钮,而我正在寻找的是紫色的。

我的电脑背景从未改变,我做了一些 screen.highlight() 并查看正确的屏幕(双屏)。这不是图像路径的问题(已经解决了这个问题)。

你知道我可以尝试什么吗?我读过关于人们使用 Sikuli IDE 还是其他 IDE 的成功率不同的文章。所以也许我可以试试 sikuli IDE。

我一回到家就可以提供代码示例。

我用来测试的代码:

public class CleanTest 
    
    static Screen screen = new Screen();

    public static void main(String[] args) throws FindFailed, AWTException, IOException, InterruptedException 
        String pathYourSystem = System.getProperty("user.dir") + "\\";
        System.out.println(pathYourSystem);
        Pattern pLauncher = new Pattern(pathYourSystem+"img\\full_launcher.PNG").similar(0.9d);
        Desktop.getDesktop().open(new File("path_to_an_exe_opening_a_launcher"));
        screen.wait(pLauncher, 300);
        screen.mouseMove();
        System.out.println("launcher found");
    


它适用于“完整启动器”图像,但找不到启动器的子部分(按钮)。我尝试编写一些代码来测试类似参数是否存在阈值:

double similarValue = 1d;
        Pattern pLauncher = new Pattern(pathYourSystem+"img\\the_button.PNG").similar(similarValue);
        Desktop.getDesktop().open(new File("path_to_an_exe_opening_a_launcher"));
        
        while(!screen.has(pLauncher)) 
            similarValue-=0.1;
            pLauncher = new Pattern(pathYourSystem+"img\\login.PNG").similar(similarValue);
        
        System.out.println(similarValue);
        screen.mouseMove();

它会在 0.5 左右找到一些东西,但它是一个完全不同的按钮。

谢谢!

编辑:如果有人遇到同样的问题,请尝试使用 sikulix IDE 截取屏幕截图。它适用于 IDE 截取的屏幕截图。

【问题讨论】:

【参考方案1】:

这是一个简单的测试,完全符合 SikuliX 的功能。

import org.sikuli.basics.Debug;
import org.sikuli.script.*;

public class SikulixTest 
  public static void main(String[] args) 
    System.out.println("SikulixTest");
    Screen scr = new Screen();
    // craete an image to be searched on the screen
    Image img = new Image(scr.userCapture());
    // try to find it
    Match mImg = scr.exists(img);
    if (mImg != null) 
      // show sthg. when found
      Debug.info("%s", mImg);
      mImg.highlight(2);
    
  

这是来自 SikuliX 的 RaiMan

【讨论】:

感谢您的回答。测试工作正常,即使在我从外部图像进行测试期间未找到的部分屏幕上也是如此。我将编辑我的原始帖子以添加一些代码。 我做了更多的测试:如果我截取我的 IDE 的一部分然后运行一个简单的while(!screen.has(&lt;myScreenPath&gt;)) screen.getLastMatch().highlight(2); 它不会突出任何东西,除非我打开图像文件并显示它屏幕。这很奇怪。我试图拔掉我的第二台显示器,使用不同的工具截屏,但没有成功。

以上是关于Java 上的 Sikuli 无法识别图像的主要内容,如果未能解决你的问题,请参考以下文章

Java 自动化 - 调用sikuli实现图像识别桌面自动化:打开浏览器查询天气实例演示,java调用图形化脚本语言sikuli实现自动化

Java 自动化 - 调用sikuli实现图像识别桌面自动化:打开浏览器查询天气实例演示,java调用图形化脚本语言sikuli实现自动化

Java 自动化 - 调用sukuli实现图像识别桌面自动化:打开浏览器查询天气实例演示,java调用图形化脚本语言sikuli实现自动化

使用 java 时,Sikuli 中的文本识别 (OCR) 已关闭

无法识别导航栏的图像视图上的触摸。?

如何在java中使用sikuli进行自动化测试