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(<myScreenPath>)) screen.getLastMatch().highlight(2);
它不会突出任何东西,除非我打开图像文件并显示它屏幕。这很奇怪。我试图拔掉我的第二台显示器,使用不同的工具截屏,但没有成功。以上是关于Java 上的 Sikuli 无法识别图像的主要内容,如果未能解决你的问题,请参考以下文章
Java 自动化 - 调用sikuli实现图像识别桌面自动化:打开浏览器查询天气实例演示,java调用图形化脚本语言sikuli实现自动化
Java 自动化 - 调用sikuli实现图像识别桌面自动化:打开浏览器查询天气实例演示,java调用图形化脚本语言sikuli实现自动化
Java 自动化 - 调用sukuli实现图像识别桌面自动化:打开浏览器查询天气实例演示,java调用图形化脚本语言sikuli实现自动化