動態偵測使用EMGU(OpenCV)

簡單的影像處理工具-EMGU,人人都是影像處理大師。

作畢業專題的時候剛好是影像處理相關的領域,原本一開始傻傻的研究演算法,搞得頭昏腦脹,冥冥之中發現一個偉大的發明,那就是OpenCV,他有一個分身教作EMGU,可以在.NET平台上輕鬆的操作,關於EMGU的安裝與初始化,這邊我推薦小歐大大的文章【[C#] OpenCV 初體驗】,大家可以只安裝EMGU,若是要使用到OpenCV的話,安裝方法請詳閱OpenCV官方網站的教學。

今天要介紹的是動態偵測,顧名思義就是要偵測影像中有在變動的部分,把他們MARK起來,一般市面上的應用中會再加上各種不同的創意,不過這也算是試金石了,畢業專題離現在也好多個秋冬了,所以第一篇EMGU的文章就先從Example開始吧,簡單的改造一下,有興趣的朋友可以留言討論喔。

PS:其實我比較熟悉OpenCV,語言當然是C++,EMGU是指導學弟妹時使用的@@,難度低很多,請大家安心服用。

 

1.宣告我們即將會使用到的變數,包括前景、機影像…等。


	private static MCvFont _font = new MCvFont(Emgu.CV.CvEnum.FONT.CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0);
private static Capture _cameraCapture;
private static BlobTrackerAuto<Bgr> _tracker;
private static IBGFGDetector<Bgr> _detector;

 

2.寫一個函數,啟動攝影機補捉影像,並讓影像鏡像,讓人比較習慣


	void Run()
{
    try
    {
        _cameraCapture = new Capture();
        _cameraCapture.FlipHorizontal = !_cameraCapture.FlipHorizontal;//flip
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
        return;
    }

    _detector = new FGDetector<Bgr>(FORGROUND_DETECTOR_TYPE.FGD);

    _tracker = new BlobTrackerAuto<Bgr>();

    Application.Idle += ProcessFrame;
}

 

3.影像處理函數,包含去除雜訊、前景遮罩…等


	void ProcessFrame(object sender, EventArgs e)
{
    Image<Bgr, Byte> frame = _cameraCapture.QueryFrame();
    frame._SmoothGaussian(3); //filter out noises

    #region use the background code book model to find the forground mask
    _detector.Update(frame);
    Image<Gray, Byte> forgroundMask = _detector.ForgroundMask;
    #endregion

    imageBox1.Image = forgroundMask;
}

以上就大功告成了,程式跑出來的樣子如下圖:

PeterDotNetCS10091401

 

背景是黑色的,移動的部分影像會反白,有興趣的朋友可以先計算要框起來的部分有多大,在用以下的範例程式框起來:

 


	Rectangle Rect = e.rect;
Rect.Offset(f.rect.X, f.rect.Y);
image.Draw(Rect, new Bgr(Color.Red), 2);

 

以上就是今天跟大家的分享啦,內容雖然簡單,但也花了我一個小時寫,日後有更偉大的作品在PO上來給大家批評指教。

 

PeterDotNetCS10091401.zip