2014-02-06 138 views
1

嘗試在調用比較擴展方法時使用AForge.Imaging,i am getting Template's size should be smaller or equal to source image's size比較2位圖。AForge圖像比較

public static Boolean Compare(this Bitmap image1, Bitmap image2, double comparisionLevel, float threshold) 
     { 

      return new ExhaustiveTemplateMatching(threshold) 
       .ProcessImage(image1.To24bppRgbFormat(), image2.To24bppRgbFormat())[0] 
       .Similarity >= comparisionLevel; 
     } 

     public static Bitmap To24bppRgbFormat(this Bitmap img) 
     { 
      return img.Clone(new Rectangle(0, 0, img.Width, img.Height), 
       System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
     } 

我在想什麼?

+1

我沒有看到任何副手,看起來會導致錯誤。你確定你的擴展方法是錯誤的根源嗎?有可能擴展方法工作正常,但是'ProcessImage'不喜歡傳遞給它的值。我建議將'img.Clone'的結果設置爲局部變量,然後返回,然後嘗試調試應用程序。如果'To24bppRgbFormat'沒有拋出異常,那麼你可以看到它實際返回的值,這可能會幫助你解決問題。 –

回答

2

根據您所得到的錯誤以及ExhaustiveTemplateMatching調用的文檔,它看起來像image2大於image1。我不認爲你的擴展方法有任何錯誤。

總體而言,它看起來像你自己的問題是image1image2本身。一種可能的解決方案是添加邏輯來確定哪個圖像較大,然後通過該參數作爲sourceImage參數,並通過另一個作爲templateImage

我不知道這種方法是如何處理的情況下此搜索較高,但圖像2較寬,但...

免責聲明:我從來沒有使用AForge;我只是從整體C#知識和對方法文檔的簡要介紹中搜集到的。

+0

這是有益的感謝,我認爲它內部處理所有這些,至少我知道什麼是錯誤的現在 – FPGA

+0

這兩個圖像的簡單區域檢查可能適用於你,雖然仍然存在一個問題,其中一個更高,另一個更寬的。 AForge甚至可能不支持這些類型的比較。 –

+0

是的,這是比較兩個相同大小或圖像的圖像本身工作得很好的問題 – FPGA

1

模板圖像大小(寬度和高度)必須小於您要triyng比較的圖像。

的第一件事做的是這樣的:

if(templateImage.Height > uploadedImage.Height || templateImage.Width > uploadedImage.Width) 
    uploadedImage = ResizeImage(uploadedImage, uploadedImage.Height, templateImage.Width) 

你可以找到很多一ResizeImage的實現,我發現這個有趣的一個(https://stackoverflow.com/a/6501997/3852812),你只需要與數學更換Math.Min .Max