2013-03-01 74 views
0

我試圖找到另一個使用AForge框架內一個圖像的座標:AForge ExhaustiveTemplateMatching工作極其緩慢

ExhaustiveTemplateMatching tm = new ExhaustiveTemplateMatching(); 
TemplateMatch[] matchings = tm.ProcessImage(new Bitmap("image.png"), new Bitmap(@"template.png")); 
int x_coordinate = matchings[0].Rectangle.X; 

ProcessImages大約需要2分鐘完成。

圖像的大小大約是1600x1000像素 模板的尺寸約爲60×60像素

有誰知道如何加快這一進程?

回答

0

至於除了其他的答案,我會說,你的情況:

圖像的大小大約是1600x1000像素模板的尺寸約爲60×60像素

這個框架是不是最合適的。你試圖實現的是更多的搜索圖像在其他圖像,比比較兩個不同分辨率的圖像(如「搜索谷歌這個圖像」可以使用)。

關於本這樣

稱爲金字塔搜索。

確實,該算法的工作方式更快爲更大圖像。其實image-pyramid是基於template matching。如果我們把最流行的實現(我發現和使用):

private static bool IsSearchedImageFound(this Bitmap template, Bitmap image) 
    { 
     const Int32 divisor = 4; 
     const Int32 epsilon = 10; 

     ExhaustiveTemplateMatching etm = new ExhaustiveTemplateMatching(0.90f); 

     TemplateMatch[] tm = etm.ProcessImage(
      new ResizeNearestNeighbor(template.Width/divisor, template.Height/divisor).Apply(template), 
      new ResizeNearestNeighbor(image.Width/divisor, image.Height/divisor).Apply(image) 
      ); 

     if (tm.Length == 1) 
     { 
      Rectangle tempRect = tm[0].Rectangle; 

      if (Math.Abs(image.Width/divisor - tempRect.Width) < epsilon 
       && 
       Math.Abs(image.Height/divisor - tempRect.Height) < epsilon) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 

應該關閉給你一個圖片這一個:

page pyramid

作爲底線 - 嘗試用不同的方法。也許接近Sikuliintegration.Net。或者你可以試試accord .Net更新版本的AForge。

如果這是太多的工作,你可以嘗試擴展你的屏幕截圖功能,裁剪所需的頁面元素(Selenium example)。

0

對於最近的CPU來說,2分鐘看起來太多了,因爲圖像是您正在使用的模板大小。但是有幾種方法可以加速這個過程。第一個是使用較小的規模。這被稱爲金字塔搜索。您可以嘗試將圖像和模板分成4份,以便您可以獲得400x250的圖像和15x15的模板,並匹配此較小的模板。這會跑得更快,但它也會不太準確。然後,您可以使用15x15模板中找到的有趣像素,並使用60x60模板在1600x1000圖像中搜索相應的像素,而不是搜索整個圖像。

取決於模板的細節,您可以嘗試更低的比例(1/8)。

要知道的另一件事是一個更大的模板將運行得更快。這是違反直覺的,但有了更大的模板,您將有更少的像素進行比較。所以如果可能的話,嘗試使用更大的模板。有時如果你的模板已經儘可能大,這種優化是不可能的。