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

How to Find Exact match of an Image in Sikuli with Java

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

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

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

enter image description here
enter image description here

以下是代码尝试:

创建方法:

1
2
3
4
5
6
7
8
9
10
11
12
 public static boolean clipExist(Screen screen, String clip )
 {
        Match m = screen.exists(clip);
         if(m != null)
      {
              return true;
        }
       else
       {
          return false;
       }
   }

使用方法:

1
2
3
4
5
6
7
8
9
10
11
        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\
oles\\UK\\ENTP\\GEDIS_SALES_SUPPORT_ORL_CPF2.0_UK_ENTP.PNG"))
       {
        screen.doubleClick("C:\\Users\\Satish_D1\\workspace\\Sikuli Demo\\Images\
oles\\UK\\ENTP\\GEDIS_SALES_SUPPORT_ORL_CPF2.0_UK_ENTP.PNG",0);
        break;
       }
      }


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

1
    Match m = screen.exists(clip);

通过:

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

我使用's'作为屏幕类参考。因此,一旦我们得到一个图像,那么我们将设置相同的区域,然后是您想要点击的所需图像

1
2
3
4
5
6
7
8
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");
}


您可以选择以下选项。

第一种选择:捕获滚动条

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

    1
    2
    3
    4
    5
    6
    down_arrow ="downarrow.png"
    complete_scroll ="completescroll.png"

    while not exists(complete_scroll):
        click(down_arrow)
        hover(Location(300, 200))

    第二种选择,使用键盘(向下键)

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

    1
    2
    3
    4
    inside_item ="inside.png"

    for n in range(10000):
        type(Key.DOWN)

    希望能帮助到你


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