我正在网络摄像头图像上运行一个进程。只有在发生重大变化时,我才想唤醒该过程。
- 图像中有移动的东西
- 灯亮起
- ...
所以我在 C# 中寻找一种快速有效的算法来比较相同大小的 2 字节 [](kinect 图像)。
- 我只需要一种带有阈值的“差异大小”
- 我找到了一些运动检测算法,但它“太多了”
- 我找到了一些 XOR 算法,但它可能太简单了?如果我能忽略阳光、振动等微小的变化,那就太好了……
一个概念:MPEG 标准涉及运动检测。也许您可以监控 MPEG 流的带宽。如果没有运动,则带宽非常低(关键帧(I 帧)期间除外)。如果发生变化并且正在进行任何移动,则带宽会增加。
因此,您可以做的是抓取 JPEG 并将其输入 MPEG 编码器编解码器。然后你可以只看编码流。您也可以在一定范围内调整帧速率和带宽,另外还可以决定编解码器输出流的阈值是多少,这意味着“运动”。
优点:非常通用并且有可用的库,它们通常提供硬件加速(VGA/GPU 有助于 JPEG 编码/解码和一些或更多 MPEG)。这也很标准。缺点:比 XOR 要求更高的计算量。
将与上一张图像不同的所有像素标记为“更改”
过滤掉噪声像素 - 即如果像素被标记为已更改但所有相邻像素都没有 - 将其视为噪声并取消标记为已更改
计算图像上改变了多少像素并与Threshold进行比较(需要手动校准)
确保您在灰度图像(不是 RGB)上进行操作。即转换为 YUV 图像空间并仅在 Y 上进行比较。
这将是最简单和最快的算法——您只需要调整这两个阈值。