我正在使用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>
答案 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个通道的最大差异。这种方法总是适用于我的各种背景减法需求。