這次目標做出一個背景相減
原理:
Step1. 先建立一個背景模型
Step2. 在針對後續出現的每一張一直不斷更新的影像去跟背景模型做相減
一個一個像素數值會具有亮度的差異
最後得到我們想要的移動前景
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Emgu.CV;
using Emgu.Util;
using Emgu.CV.CvEnum;
using Emgu.CV.Structure;
using Emgu.CV.UI;
namespace 背景相減提取手部
{
public partial class Form1 : Form
{
#region Globle Var
Capture _capture = null; // 攝影機
Image<Gray, Byte> difI; //相減後顯示灰階亮度差異
Image<Gray, byte> grayFrame; //在做背景模型前先準備灰階暫存用的影像存放結構體
Image<Bgr, Byte> frame; //原彩影
Image<Gray, Byte> refI; //參考影像
Image<Gray, Byte> grayBg; //接受參考影像用來做顯示背景模型用
//切換流程用的Flag
bool _newRef = false;
bool cap = false;
bool frameDiff = false;
bool frameBinary = false;
#endregion
public Form1()
{
InitializeComponent();
Application.Idle += updateFrame;
}
private void updateFrame(object sender, EventArgs e)
{
if (cap)
{
frame = _capture.QueryFrame();//這裡不斷接收新的下一frame
imageBox1.Image = frame.Flip(Emgu.CV.CvEnum.FLIP.HORIZONTAL);//水平翻轉
if (frameDiff)
{
grayFrame = frame.Convert<Gray, Byte>();//轉灰階
grayFrame = grayFrame.Flip(Emgu.CV.CvEnum.FLIP.HORIZONTAL);//水平翻轉
if (_newRef!=true)
{
refI = grayFrame;
_newRef = true;
grayBg = new Image<Gray, Byte>(refI.Width, refI.Height);
}
difI = grayFrame.AbsDiff(refI);
imageBox2.Image = difI;
if (frameBinary)
{
difI = difI.ThresholdBinary(new Gray(60), new Gray(255));
imageBox3.Image = difI;
}
}
}
}
private void openWebcam_Click(object sender, EventArgs e)
{
cap = true;
_capture = new Capture();
}
private void btnBG_Click(object sender, EventArgs e)
{
frameDiff = true;
}
private void btnBinary_Click(object sender, EventArgs e)
{
frameBinary = true;
}
}
}
動態的
就好比一直有手這個前景出現在視訊畫面中
跟後面背景有明顯差異
沒有留言:
張貼留言