2011-12-14 18 views
0

WPFで2つの異なるビットマップソースを比較する方法があるかどうかは疑問ですか?2つのビットマップソースの比較

私のシナリオでは、ウェブカメラで単純なモーションセンサーを作成しようとしていて、ウェブカメラからのショットを定期的に撮っています。次に、ショットから取得したbitmapSourcesを取得し、それらの間にデルタがあるかどうかを確認する必要があります(つまり、何かがカメラのフィード内で移動した)。 http://www.codeproject.com/KB/GDI-plus/comparingimages.aspx

サンプル:事前

答えて

1

にあなたはこのような何かを試みることができる

おかげでここ

using System; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.Security.Cryptography; 

namespace Imagio 
{ 
    public class ComparingImages 
    { 
     public enum CompareResult 
     { 
      ciCompareOk, 
      ciPixelMismatch, 
      ciSizeMismatch 
     }; 

     public static CompareResult Compare(Bitmap bmp1, Bitmap bmp2) 
     { 
      CompareResult cr = CompareResult.ciCompareOk; 

      //Test to see if we have the same size of image 
      if (bmp1.Size != bmp2.Size) 
      { 
       cr = CompareResult.ciSizeMismatch; 
      } 
      else 
      { 
       //Convert each image to a byte array 
       System.Drawing.ImageConverter ic = 
         new System.Drawing.ImageConverter(); 

       byte[] btImage1 = new byte[1]; 
       btImage1 = (byte[])ic.ConvertTo(bmp1, btImage1.GetType()); 
       byte[] btImage2 = new byte[1]; 
       btImage2 = (byte[])ic.ConvertTo(bmp2, btImage2.GetType()); 

       //Compute a hash for each image 
       SHA256Managed shaM = new SHA256Managed(); 
       byte[] hash1 = shaM.ComputeHash(btImage1); 
       byte[] hash2 = shaM.ComputeHash(btImage2); 

       //Compare the hash values 
       for (int i = 0; i < hash1.Length && i < hash2.Length 
           && cr == CompareResult.ciCompareOk; i++) 
       { 
        if (hash1[i] != hash2[i]) 
         cr = CompareResult.ciPixelMismatch; 
       } 
      } 
      return cr; 
     } 
    } 
} 
+0

ビットマップソースが同じであるように見えても、なぜそうだと思いますか?そこに集まることは、肉眼で見ることができないイメージに小さな違いがある可能性があります。小さなデルタが考慮されるようにしきい値を設定する方法はありますか? – Matt

+0

ヘッダー情報と何か関係があります。彼らがタイムスタンプが違うなら、それはそれを投げるのに十分だろうと思うだろう。私は著者がそれに対処したとは思わない。 – Xcalibur37

0

は、最後の1のディスカッションスレッドの深い速い例です。それがうまくいくかどうかを確認してください。

public sealed class ImageHash 
{ 
    private static SHA256Managed _shaM; 
    private static SHA256Managed shaM 
    { 
     get 
     { 
      if (_shaM == null) 
       _shaM = new SHA256Managed(); 

      return _shaM; 
     } 
    } 

    private static System.Drawing.ImageConverter _imageConverter; 
    private static System.Drawing.ImageConverter imageConverter 
    { 
     get 
     { 
      if (_imageConverter == null) 
       _imageConverter = new System.Drawing.ImageConverter(); 

      return _imageConverter; 
     } 
    } 

    public Image Image { get; private set; } 

    private byte[] _Hash; 
    public byte[] Hash 
    { 
     get 
     { 
      if (_Hash == null) 
      { 
       _Hash = (byte[])imageConverter.ConvertTo(Image, typeof(byte[])); 
       _Hash = shaM.ComputeHash(_Hash); 
      } 

      return _Hash; 
     } 
    } 

    public ImageHash(Image image) 
    { 
     this.Image = image; 
    } 
} 

public static class ComparingImages 
{ 
    public enum CompareResult 
    { 
     ciCompareOk, 
     ciPixelMismatch, 
     ciSizeMismatch 
    }; 

    public static CompareResult Compare(ImageHash img1, ImageHash img2) 
    { 
     CompareResult cr = CompareResult.ciCompareOk; 

     //Test to see if we have the same size of image 
     if (img1.Image.Size != img2.Image.Size) 
     { 
      cr = CompareResult.ciSizeMismatch; 
     } 
     else 
     { 
      for (int i = 0; i < img1.Hash.Length && i < img2.Hash.Length 
           && cr == CompareResult.ciCompareOk; i++) 
      { 
       if (img1.Hash[i] != img2.Hash[i]) 
        cr = CompareResult.ciPixelMismatch; 
      } 
     } 
     return cr; 
    } 
}