簡單的影像處理工具-EMGU,人人都是影像處理大師。
今天要介紹的是動態偵測,顧名思義就是要偵測影像中有在變動的部分,把他們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;
}
以上就大功告成了,程式跑出來的樣子如下圖:
背景是黑色的,移動的部分影像會反白,有興趣的朋友可以先計算要框起來的部分有多大,在用以下的範例程式框起來:
Rectangle Rect = e.rect;
Rect.Offset(f.rect.X, f.rect.Y);
image.Draw(Rect, new Bgr(Color.Red), 2);
以上就是今天跟大家的分享啦,內容雖然簡單,但也花了我一個小時寫,日後有更偉大的作品在PO上來給大家批評指教。