2

我有一个无头运行的测试服务器。我想要的一项测试是检查从特定 URL 提供的图像是否与某些参考图像匹配。

Sikuli 中是否有一个 API 可以直接接受图像作为流并将其与从本地资源文件中获取的其他图像进行比较?不幸的是,没有关于 Sikuli 的 Java API 的完整教程,我发现的只是假设有可用显示的教程。

我很高兴看到任何示例或至少链接到 Sikuli javadocs 所需部分。此外,欢迎对其他方法提出建议。

4

2 回答 2

4

要使用 Sikuli,您需要

  1. 将在其上搜索其他图像的基本图像。
  2. 将在另一个图像中搜索的图像。

如果图像 1 是您的本地资源图像,您可以创建一个 org.sikuli.Finder 实例,其中包含图像的路径和将被搜索的该图像的区域。示例(Java 级别):

finder = new Finder("path/to/image", new Region(0, 0, <imgwidth>, <imgheight>));

如果图像 1 是您的流,则必须以某种方式从中制作 BufferedImage (我不知道最好的方法)。然后,您可以借助 java.awt.Rectangle 和 org.sikuli.Region 从此 BufferedImage 制作 org.sikuli.ScreenImage。

finder = new Finder(new ScreenImage(new Rectangle(0,0,<imgwidth>,<imgheight>), bufferedImage), new Region(0,0,<imgwidth>,<imgheight>))

从图像 1 创建查找器后,您可以在此图像中搜索图像 2。

同样,您有两种可能性。如果第二个图像是您的本地资源图像,您可以使用文件位置创建一个 org.sikuli.Pattern 对象:

pattern = new Pattern("path/to/image.png");

否则,如果这是您的流,您必须以某种方式从流中创建一个 BufferedImage。然后,您可以从此图像创建图案:

pattern = new Pattnern(bufferedImage);

作为最后一步,您现在可以运行 finder 来搜索模式:

finder.find(pattern);

您可以检查查找器是否发现任何内容:

finder.hasNext();

您应该能够通过以下方式迭代所有发现:

for (Match m : finder):
    //do something with the match

我希望我能帮助你,尽管你的问题已经有几个星期了。

于 2012-11-09T19:05:59.423 回答
0

下面的代码有助于断言图像

//截图

  File scrFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);

 try {

//copy it some location

FileUtils.copyFile(scrFile, new File("C:\\screenshot.png"));
Finder f = new Finder("C:\\screenshot.png");
System.out.println("abc");
f.find("C:\\chrome3.png", 0.95);

while(f.hasNext()){

 System.out.println("found");
 Match m= f.next();
 f.destroy();
}

  }    
   catch (IOException e)
{
    e.printStackTrace();
  }
于 2015-03-11T13:14:09.740 回答