如何在Java中找到Sikuli中图像的精确匹配

时间:2015-11-20 10:50:04

标签: sikuli sikuli-script sikuli-ide

是Sikuli的新手,并尝试自动化Citirx应用程序。需要帮助

我试图在屏幕中选择用户角色,屏幕有多个角色,因此我需要向下滚动屏幕并搜索特定角色并单击角色。

我有一个特定角色的捕获图像,我需要在Code下面选择和使用。在第二张图片中,我突出了我需要在红色中选择的角色

enter image description here enter image description here

以下是Code an Trying:

创建方法:

 public static boolean clipExist(Screen screen, String clip )
 {
        Match m = screen.exists(clip);
         if(m != null)
      {
              return true;
        }
       else
       {
          return false;
       }
   }

使用方法:

        while(! clipExist(screen, "C:\\Users\\Satish_D1\\workspace\\Sikuli Demo\\Images\\DownArrow.PNG"))       
    {           
       screen.wheel(1 , 3);     
       if(clipExist(screen, "C:\\Users\\Satish_D1\\workspace\\Sikuli Demo\\Images\\Roles\\UK\\ENTP\\GEDIS_SALES_SUPPORT_ORL_CPF2.0_UK_ENTP.PNG"))
       {
        screen.doubleClick("C:\\Users\\Satish_D1\\workspace\\Sikuli Demo\\Images\\Roles\\UK\\ENTP\\GEDIS_SALES_SUPPORT_ORL_CPF2.0_UK_ENTP.PNG",0);
        break;
       }
      }

4 个答案:

答案 0 :(得分:1)

图像识别默认使用0.7的相似度(参见description of Patterns in SikuliX Documentation)。这意味着SikuliX寻找“非常相似”的图像。由于方法similar,您可以指定模式识别的相似性,或者在您的情况下使用方法exact。 在方法clipExist中,您应该替换图片的名称:

    Match m = screen.exists(clip);

由:

    Match m = screen.exists(Pattern(clip).exact())

答案 1 :(得分:0)

似乎SikuliX 1.1在屏幕上查找文本时遇到了一些问题,但识别起作用。您可能希望按屏幕扫描整个文本屏幕并分割线条。接下来将每行与所需角色进行比较并保存相似度。选择具有最大相似性的行。在Python / Jython中,difflib模块中存在一个特殊的函数。 similarity = difflib.SequenceMatcher(None, string_a, string_b)

答案 2 :(得分:0)

以下是您可以选择的替代方案。

第一种选择:捕获滚动条

  1. 捕捉滚动条中的向下箭头
  2. 到达滚动条末尾时捕获图像。该图像包含滚动条的滚动进度和向下箭头
  3. 单击向下箭头,直到找到(2)
  4. 的图像

    该方法具有缺点,即当项目的数量是动态的时,(2)的视觉外观将是不同的,尤其是滚动进度。但是,这可以通过仅捕获滚动进度的下半部分和箭头来欺骗。请注意,您的鼠标可能会在(3)中遇到困难,因为当鼠标覆盖时您可能找不到(2)。要处理此问题,每次单击向下箭头,您可能会在检查(2)之前将鼠标悬停一点。这是完整的脚本:

    down_arrow = "downarrow.png"
    complete_scroll = "completescroll.png"
    
    while not exists(complete_scroll):
        click(down_arrow)
        hover(Location(300, 200))
    

    第二种方法,使用键盘(向下键)

    单击要滚动的项目中的任意位置,并为您拥有的项目数量键入(Key.DOWN)。如果您有动态的项目编号,您可以为任何总是大于您的项目数量的数字键入(Key.DOWN)。这是要做的脚本

    inside_item = "inside.png"
    
    for n in range(10000):
        type(Key.DOWN)
    

    希望有所帮助

答案 3 :(得分:0)

我使用's'作为屏幕类参考。因此,一旦获得图像,我们将为该区域设置相同的区域,然后是您要单击的必需图像

public static void main(String args[])
{
    Match m = s.find("IMAGE");
    Region r = new Region(m.x+11, m.y+22,12,12);
    r.click(); 
    s.find("ENTPIMAGE.PNG");
    r.click("ENTPIMAGE.PNG");
}