幀差法Motion Detection(基於EmguCV實現)
阿新 • • 發佈:2018-12-30
幀差法,用公式表達就是
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連結