2012-09-20 84 views
0

是否有快速的方法在屏幕上查找圖像?屏幕上的java搜索圖像

我不喜歡的是:(在此之前,我捕捉與Robot.createScreenCapture(...)屏幕)

public static Point search(BufferedImage big, BufferedImage small) { 
    Robot robot = null; 
    try { 
     robot = new Robot(); 
    } catch (AWTException e) { 
     e.printStackTrace(); 
    } 
    long time=System.currentTimeMillis(); 
    for (int x = 0; x < big.getWidth() - small.getWidth(); x++) { 
     for (int y = 0; y < big.getHeight() - small.getHeight(); y++) { 
      if (compare(x, y, big, small)) { 
       return new Point(x, y); 
      } 
     } 
    } 
    System.out.println(System.currentTimeMillis()-time); 
    return null; 
} 

private static boolean compare(int xs, int ys, BufferedImage img1, BufferedImage img2) { 
    for (int x = 0; x < img2.getWidth(); x++) { 
     for (int y = 0; y < img2.getHeight(); y++) { 
      if (img1.getRGB(x + xs, y + ys) != img2.getRGB(x, y)) { 
       return false; 
      } 
     } 
    } 
    return true; 
} 

但有時只需200毫秒,但有時10000ms! :(

編輯:...如果有人知道AutoHotkey的,這是另一種編程語言,有一個名爲「圖片搜索」功能,發現在幾毫秒內的圖像(基於C++,我認爲)

回答

3

兩個可能的事情:

  1. 您使用的算法是不是真快:這是一個O(MN)算法,所以你應該尋找到better ones如KMP算法

  2. 之前搜索圖像,可能首先壓縮它們然後搜索,並使用其他檢查來確保壓縮不會影響算法。一個簡單的「拿出其他線」應該可以加快程序的速度。

+0

如果我使用該KMP進行搜索,那會更快嗎? 或者從autohotkey製作一個exe文件,然後以某種方式實現它會更好嗎? – TeNNoX

+0

它可能是,但是如果你搜索一些實現快速字符串匹配算法的庫,它會好得多。而且因爲我沒有聽說過autohotkey,所以在你提到它之前,我沒有什麼可以說的。也許我應該試一試! –

+0

所以這裏是一個......但我怎麼能用像素? http://johannburkard.de/software/stringsearch/ – TeNNoX