2011-02-22 76 views
5

我想弄清楚在C#中使用Sikuli圖像識別的方法。我不想使用Sikuli本身,因爲它的腳本語言有點慢,因爲我真的不想在我的.NET C#應用程序中引入java橋。在屏幕上查找字段位置的屏幕區域識別

所以,我有一個位圖,它代表了我的屏幕區域(我將稱之爲該區域BUTTON1)。屏幕布局可能稍微有所變化,或者屏幕可能已在桌面上移動 - 因此我無法使用直接位置。我必須首先找到BUTTON1的當前位置位於現場屏幕內的位置。 (我試圖發佈此圖片,但我想我不能,因爲我是一個新用戶...我希望描述清楚...)

我認爲Sikuli在封面下使用OpenCV 。由於它是開源的,我想我可以對其進行逆向工程,並找出如何在OpenCV中完成它們,在Emgu.CV中實現它 - 但是我的Java並不強大。

我尋找的例子顯示了這一點,但所有的例子要麼非常簡單(即如何識別停車標誌)或非常複雜(即如何做面部識別)......也許我只是密集,但我似乎無法在如何做到這一點的邏輯上跳躍。另外我擔心所有各種圖像處理例程實際上都是處理器密集型的,我真的希望它儘可能輕量級(實際上我可能會在屏幕上找到很多按鈕和字段.. 。)

所以,我想這樣做,而不是方法是:

A)轉換的位圖字節數組和做蠻力搜索。 (我知道如何做那部分)。然後

B)使用我發現的字節數組位置來計算它的屏幕位置(我真的不完全確定我是怎麼做的),而不是使用圖像處理的東西。

這是完全瘋了嗎?有沒有人有一個簡單的例子,說明如何使用Aforge.Net或Emgu.CV來做到這一點? (或如何充實上面的步驟B ...?)

謝謝!

+0

+1真棒問題 - 我希望有人會有一個很好的答案! – Charles 2011-05-26 15:12:15

回答

0

一般來說,它聽起來像你想要的基本對象識別。我對SIKULI沒有任何經驗,但有很多方法可以做物體識別(基於邊緣的模板匹配等)。這就是說你可能能夠直接進行直方圖匹配。

http://www.codeproject.com/KB/GDI-plus/Image_Processing_Lab.aspx

該頁面應該告訴你如何使用AForge.net得到一個圖像的直方圖。你只想做一個蠻力搜索使用這樣的事情:

Bitmap ImageSearchingWithin=new Bitmap("Location of image"); //or just load from a screenshot or whatever 
for (int x = 0; x < ImageSearchingWithin.Width - WidthOfImageSearchingFor; ++x) 
{ 
    for (int y = 0; y < ImageSearchingWithin.Height - HeightOfImageSearchingFor; ++y) 
    { 
     Bitmap MySmallViewOfImage = ImageSearchingWithin.Clone(new Rectangle(x, y, WidthOfImageSearchingFor, HeightOfImageSearchingFor), System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
    } 
} 

然後將新創建位圖的直方圖比較,你的原始圖像的計算的一個(無論面積在匹配方面最接近的是什麼你會選擇作爲BUTTON1的區域)。這不是最優雅的解決方案,但它可能適合您的需求。否則,你會陷入更困難的技術(當然,我可能會忘記一些可能更簡單的事情)。

+0

我打算接受這個答案,只是因爲我沒有看到任何有價值的東西。說實話,當我發現Sikuli下面的OCR庫存在內存泄漏問題時,我放棄了這一點。直方圖是要走的路,但還有很多工作需要從這裏進行...... – MarkJoel60 2011-08-22 20:44:09