2幅图像之间的运动/差异检测

时间:2013-11-22 10:33:08

标签: c# opencv motion-detection

我正在做一个动作检测应用程序作为A c#winform app。

我使用openCV和emgu包装来识别动作(我想要捕获)。

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

我给了md5一个只是为了看看我是否可以使用它来快速检测两个图像之间是否有任何差异。我在99%的时间里发现2张图像的md5不匹配,因此告诉我2张图像之间存在差异。我假设运动检测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 个答案:

答案 0 :(得分:2)

MD5是一种加密哈希函数,因此即使输入中的单个位发生变化,它也会故意产生一个完全不同的哈希值。因此,仅仅因为两个输入“接近”(即差异很小),MD5哈希值将不会是算法中固有的,并且不能以您需要的方式“调整”。

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

给出的基本方法是将要比较的图像转换为灰度,调整它们以使它们只有几个像素宽/高,然后通过比较它将每个像素转换为黑/白(1位/像素)所有像素的平均值。然后,您可以计算两个图像之间的像素差异 - 不同像素的数量越大,原始图像中可能存在的差异就越大。

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