2013-11-22 70 views
0

我正在做一个运动检测应用程序,作为c#winform应用程序。2张图片之间的运动/差异检测

我使用openCV和emgu包装来辨别运动(我想陷入)。

很多时候没有动作变化,但我仍然需要在我的代码中检查它。

我给了md5一个去看看我是否可以使用它来快速检测2张图像是否有差异。我在99%的时间里发现2张图片的md5不匹配,因此告诉我这两张图片之间存在差异。我假设运动检测md5对于这样的任务不会太“敏感”吗?

可以将Md5设置为具有%差异阈值或/和是否有另一种方法来做到这一点?

感谢

到目前为止的代码:

private string getMd5Hash(byte[] buffer) 
    { 
     MD5 md5Hasher = MD5.Create(); 
     byte[] data = md5Hasher.ComputeHash(buffer); 

     StringBuilder sBuilder = new StringBuilder(); 
     for (int i = 0; i < data.Length; i++) 
     { 
      sBuilder.Append(data[i].ToString("x2")); 
     } 
     return sBuilder.ToString(); 
    } 

    public string GetMD5(byte[] buffer) 
    { 
     return getMd5Hash(buffer); 
    } 

//调用代码...

 string img1= t.GetMD5(data); 
     string img2= t.GetMD5(data); 

     if (img1!= img2) 
     { 
      //differences 
     } 
+1

MD5是一个安全的散列算法,不是差分计算器。整个安全哈希的一点是,一个小的输入差异会创建一个完全不同的哈希值。您正在使用错误类型的算法 –

+0

您好,非常感谢您的时间。我想我知道在我的脑海中,我对它的速度印象深刻,我希望能有类似的运动检测方法。 :) –

回答

2

MD5是加密散列函数,因此它有意产生截然不同的哈希如果它的输入甚至只有一位改变。因此,仅仅因为两个输入“接近”(即差异很小),MD5哈希将不会,这是算法固有的,并且不能按照您的要求“调整”。

有很多方法来检测相似的图像。这里给出一种可能性:http://www.hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html

给出的基本方法是将被比较的图像转换为灰度,调整它们的大小以使它们只有几个像素宽/高,然后将每个像素转换为黑/白(1比特/像素)与全部像素的平均值进行比较。然后,您可以计算两个图像之间的像素差异 - 不同像素的数量越大,原始图像的可能差异越大。

可以通过更改您减少原始图像的方式来调整此方法 - 减少的越多,图像之间的差异就越不敏感。

+0

嗨,这似乎是普遍的共识。我会看你送给我的那个链接。非常感谢你! –