2011-04-28 104 views
6

你們可以給我一些關於如何在屏幕上找到圖像的提示。我的意思是,一個簡單的像素組合。例如,它找到30x30像素白色方塊的座標。Java在屏幕上找到圖像

Java機器人類允許我找到某個像素的顏色。但是我需要與之相反,我希望我的程序能夠掃描我的屏幕,然後告訴我這個小圖像的座標。那麼我可以通過所有的像素與機器人,但它應該比這更快。快多了。

有什麼建議嗎?

回答

4

那麼我可以通過與機器人的所有像素,但它應該比這更快。快多了。

恐怕這正是你必須要做的。

如果所有像素都應該是白色,則可以先採用30像素寬的步驟,如果您找到白色像素,則採取5像素級,然後如果這些像素也是白色,則檢查方塊中剩餘的像素。

事情是這樣的:

.  .  .  .  .  . 



.  ..........  .  .  . 
     ...... 
     . . . . 

     . . . . 
.  .  .  ..........  . 
          .......... 
          .......... 
          .......... 
          .......... 
.  .  .  .......... 
+0

但它會是多快呢?編號喜歡用它來在遊戲中獲得好分數..但通過所有這些..不是它會永遠處理它嗎? – Jaanus 2011-04-28 20:13:00

+1

試一試。我曾經爲一個俄羅斯方塊機器人做過一次......它工作得很好(即使掃描一個俄羅斯方塊領域似乎比你的情況要容易一些)。 – aioobe 2011-04-28 20:20:00

+1

取決於你可以有多聰明。可能有辦法做一些二進制搜索的形式,或者可能有各種捷徑可供選擇。例如,您想要查找30x30像素的白色正方形,這意味着如果當前像素不是白色,則可以安全地跳過30個像素,而不會冒丟失正方形的風險。這一切都取決於你期望在屏幕上。 – Doug 2011-04-28 20:21:16

4

其實,還有一個更simpliler或更可靠的解決方案這一點。您可以在Java應用程序內部實現Sikuli庫,以在屏幕上找到圖像元素並與它們交互。它旨在自動化UI測試,但我認爲它可以很容易地滿足您的需求。

示例應用程序(source):

import java.net.MalformedURLException; 
import java.net.URL; 

import org.sikuli.api.*; 
import org.sikuli.api.robot.Mouse; 
import org.sikuli.api.robot.desktop.DesktopMouse; 
import org.sikuli.api.visual.Canvas; 
import org.sikuli.api.visual.DesktopCanvas; 

import static org.sikuli.api.API.*; 

public class HelloWorldExample { 

    public static void main(String[] args) throws MalformedURLException { 

      // Open the main page of Google Code in the default web browser 
      browse(new URL("http://code.google.com")); 

      // Create a screen region object that corresponds to the default monitor in full screen 
      ScreenRegion s = new DesktopScreenRegion(); 

      // Specify an image as the target to find on the screen 
      URL imageURL = new URL("http://code.google.com/images/code_logo.gif");     
      Target imageTarget = new ImageTarget(imageURL); 

      // Wait for the target to become visible on the screen for at most 5 seconds 
      // Once the target is visible, it returns a screen region object corresponding 
      // to the region occupied by this target 
      ScreenRegion r = s.wait(imageTarget,5000); 

      // Display "Hello World" next to the found target for 3 seconds 
      Canvas canvas = new DesktopCanvas(); 
      canvas.addLabel(r, "Hello World").display(3); 

      // Click the center of the found target 
      Mouse mouse = new DesktopMouse(); 
      mouse.click(r.getCenter()); 
    } 
} 

另見How to use Sikuli inside your Java programs進行安裝。

+0

我有點困惑。您正在使用我在sikuli-standalone.jar中找到的類,該類是從code.google的網站下載的,並且有關於code.google的文檔....但是,您發佈的鏈接似乎指的是另一個sikuli,它有不同的類。我下載了這兩個庫。您使用的那個工作正常,但很難找到HOWTO。另一個有更好的文檔(你發佈了鏈接),但它根本不起作用。我真的很困惑,有兩種類型的sikuli,或者是什麼?謝謝。 – Marko 2014-03-19 08:28:48

+0

我不太記得,但我認爲我只在底部共享鏈接,以便安裝/設置Sikuli以用於Java項目。這可能只是在步驟5之前纔有意義,我不會遵循那裏演示的示例代碼。您應該遵循code.google的文檔。什麼不工作?說實話,我還沒有嘗試過直接使用Java的Sikuli,只使用JRuby。但是如果它適用於JRuby,我不明白爲什麼它不適用於Java。 – Noz 2014-03-19 20:04:55

+0

sikuli-standalone **。jar對我來說很好(我從code.google下載的那個),我也發現了很多關於如何使用它的類的例子。所以現在一切都很好。我只是好奇,如果有兩種類型的sikuli。 – Marko 2014-03-20 21:59:52