2016年12月2日 星期五

背景相減_手部提取示範


這次目標做出一個背景相減




原理:

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;
        }
    }
}





動態的
就好比一直有手這個前景出現在視訊畫面中
跟後面背景有明顯差異











沒有留言:

張貼留言