2014-02-06 141 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