什么是运动检测的最佳色彩空间

时间:2013-11-27 08:57:29

标签: emgucv

我正在使用Emgu和C#。

我有来自相机Feed的jepgs流。目前我在两幅图像之间使用absdiff来获得运动变化。

Image<Bgr, byte> _diffBetweenCurrentAndPrevious = _currentFrame.Convert<Bgr, Byte>().AbsDiff(PreviousFrame.Convert<Bgr, Byte>());

然后我通过包含所有更改的图像的数据数组进行枚举,并查找高于特定阈值的运动。

 float diffCouner = 0;
 for (int y = 0; y < 576; y++)
 {
    for (int x = 0; x < 720; x++)
    {
       if (_diffBetweenCurrentAndPrevious.Data[y, x, 0] >= 10
        || _diffBetweenCurrentAndPrevious.Data[y, x, 1] >= 10 ||
         _diffBetweenCurrentAndPrevious.Data[y, x, 2] >= 10)
         {
            BaseImage.Data[y, x, 0] = _currentFrame.Data[y, x, 0];
            BaseImage.Data[y, x, 1] = _currentFrame.Data[y, x, 1];
            BaseImage.Data[y, x, 2] = _currentFrame.Data[y, x, 2];
            diffCouner++;
          }
      }
  }

目前我正在使用BGR。

使用HSV或YCC还是更好??

我注意到在使用YCC时我不得不使用较低的阈值,因为夜间经过的车辆的动作似乎并不明显。

我对最佳方法感兴趣。

或者我应该使用<Gray,Byte>格式?

我问的原因是我已经尝试了所有这些并且它们似乎都有效。但是在一天中的不同时间,它可能不会那么好,因为它会瞬间变得暗淡或明亮。或者低对比度。

我可以并且将在几天内进行测试,但我会像红色印第安人一样祈祷改变季节。

欢迎任何建议。

由于

如果有人关注我的问题,我发现使用<Gray,Byte>并没有为光线变化提供足够好的结果。

我现在正在使用<HSV,Byte>

运行测试

3 个答案:

答案 0 :(得分:2)

我曾经有过完全相同的问题。我认为没有办法解决你的问题。我建议您创建一个应用程序,如果您的组合足够好,您可以在运行时更改您的h参数,并从阈值检查。我用这个项目。我希望它会有所帮助http://www.osslab.com.tw/@api/deki/files/3550/=An_autonomous%252c_co-operative_telerobotic_agent_framework_for_WowWee_Rovio_-_Konstantinos_Tsimpoukas_1130191.pdf

答案 1 :(得分:2)

我可以建议您进行颜色跟踪以选择合适的空间颜色 因为rbg空间不是很大 好的,即使对于小的照明差异也太敏感了。 这实际上取决于您要跟踪和跟踪场景的对象, 我最好的

答案 2 :(得分:1)

如果您需要更高级别的灵敏度,请尝试以下操作(前景和背景图像均为BGR格式):

int diff0 = Math.Abs(image0.Data[j, i, 0] - image1.Data[j, i, 0]);
int diff1 = Math.Abs(image0.Data[j, i, 1] - image1.Data[j, i, 1]);
int diff2 = Math.Abs(image0.Data[j, i, 2] - image1.Data[j, i, 2]);
int diff = Math.Max(diff0, diff1);
diff = Math.Max(diff, diff2);

结果值“diff”是3个通道的最大差异。这种方法总是适用于我的各种背景减法需求。