1. 程式人生 > >幀差法Motion Detection(基於EmguCV實現)

幀差法Motion Detection(基於EmguCV實現)

幀差法,用公式表達就是

result=currentFrame-previousFrame

如果在同一背景下,目標靜止,則相鄰兩幀影象無變化,幀差為0;

如果目標正在運動,那麼幀差不為0,可以根據幀差影象跟蹤目標大致位置

視訊原畫面


幀差結果


原畫面


幀差:


攝像頭原畫面(臉部已裁掉):


幀差(顯然,搖動頭部時才可以看到較亮的輪廓,靜止時幀差為0,純黑一片):


核心程式碼如下

private void menuItemCameraCapture_Click(object sender, EventArgs e)
{
    // 部分程式碼已省略...
    try
    {
        capture = new Capture();
        previousFrame = capture.RetrieveBgrFrame(); // 第一幀
        capture.ImageGrabbed += OnCameraCapture_ImageGrabbed;
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}
		
private void OnCameraCapture_ImageGrabbed(object sender, EventArgs e)
{
    currentFrame = capture.RetrieveBgrFrame();
    ++frameCount;
    imageBoxCameraCapture.Image = currentFrame;
    imageBoxResult.Image = currentFrame.Sub(previousFrame); //幀差
    previousFrame = currentFrame.Clone(); //請使用'Clone'而不是'='
    // 部分程式碼已省略...
}


完整專案及原始碼參見這篇文章的GitHub連結