張曉華,段美霞
(華北水利水電學院 信息工程系,河南 鄭州 450011)
隨著生產(chǎn)生活對智能監(jiān)控、人機交互和視覺導航提出的要求日益提高,計算機視覺已成為信息技術一個重要的研究方向,而目標檢測則是計算機視覺的基礎和關鍵技術.目標檢測中,最活躍的研究分支是基于視頻的運動目標檢測,其目的是從連續(xù)視頻幀中檢測出運動的物體,然后提供給檢測后處理程序用于實現(xiàn)定位、跟蹤、報警與識別等應用.
AForge.NET是一個開源C#框架,利用它提供的圖像和視頻框架類可以輕松地實現(xiàn)各種圖像處理算法,并可進一步建立特定的運動目標檢測應用.
運動目標在各個領域都廣泛存在,如活動的動物、行駛的運輸工具或其他自然界中普遍存在的運動物體等,檢測的目的是在連續(xù)視頻中將變化區(qū)域從背景中分割出來.由于光照、背景的變化、攝像機的抖動、運動目標的自遮擋和互遮擋等現(xiàn)象的存在,給運動目標的正確檢測帶來了極大的挑戰(zhàn).檢測和分割運動目標的正確與否極大地影響著運動目標能否被正確識別、跟蹤和分類,在計算機視覺中占據(jù)著重要地位.
目前,常用的運動目標檢測方法有三種: 幀差分法、背景差分法和光流法[1].
前兩種方法主要用于靜態(tài)場景和有一定實時性要求的場合,兩者都基于差分原理,都通過差分運算來獲得被比較對象的差異來檢測運動對象.幀差分法和背景差分法的差異主要在于進行比較的對象不同,前者是對視頻中的相鄰幀進行差分比較[2],后者是對當前幀和特定的背景幀進行差分比較.
光流法利用的是運動物體連續(xù)圖像的像素點運動產(chǎn)生的瞬時速度場——光流場,該方法可以在場景信息未知的情況下進行運動物體的檢測,同時還可精確地進行速度計算,能夠用于動態(tài)場景.
差分法和光流法原理的不同造成了計算量上的巨大差異.大多數(shù)的光流算法抗噪聲的性能很差,計算相當復雜,對硬件的要求也非常高,所以無法適用于實時處理.差分法則以其在硬件需求和性能間的良好平衡獲得了最廣泛的應用.因此,本設計將重點介紹基于差分法的運動目標檢測的實現(xiàn).
圖像處理技術的選擇需要考慮性能和易用性的平衡.目前,比較常見的圖像處理類庫主要有三種,分別是:OpenCv,EmguCv與AForge.Net.
OpenCv的大多數(shù)功能都以C風格函數(shù)形式提供,少部分功能以C++類提供,易用性較差.EmguCv將OpenCv的絕大部分功能都包裝成了.Net類,結構或者枚舉易用性比較好.AForge.Net是純粹的.Net類庫,用起來最為方便,利用該框架可以方便地實現(xiàn)計算機視覺、圖像處理和遺傳算法、神經(jīng)網(wǎng)絡的開發(fā).在性能上,前兩者略占優(yōu)勢,但視頻開發(fā)的環(huán)境已經(jīng)在向.Net過渡.考慮到開發(fā)的易用性和開發(fā)環(huán)境的需求,選擇了開源的AForge.Net圖像處理類庫.
AForge.Imaging.Filters定義了三個公共接口:Ifilter,IinPlaceFilter和IinPlacePartialFilter.有6個抽象類實現(xiàn)了以上接口,這些抽象基類的主要區(qū)別在于三個方面:輸入圖像和輸出圖像色彩上的區(qū)別、是否在原圖上進行圖像處理以及處理區(qū)域為全圖還是局部.關于Filter具體算法的實現(xiàn)全部放在這些抽象基類的實體子類中,利用AForge的Filter命名空間即可設計實現(xiàn)運動目標檢測的功能.
在本設計中,進行差分運算的對象是24 bpp的RGB圖,這些圖其實就是從各種視頻流中獲取的幀圖像.設計以AForge.NET 庫為基礎實現(xiàn),用到的庫主要是AForge.Imaging庫,該庫包含了基本的圖像處理類;用到的主要類是Filters類,通過實例化這些類,可以很容易地實現(xiàn)視頻中運動目標的檢測.
3.1.1 差分比較
該算法先對運動圖像序列中相鄰的兩幀進行灰度處理以獲得對應的灰度圖,然后對灰度圖進行相減,通過所得圖像灰度差的絕對值來判斷是否有運動物體.當差值大于預設的閾值時,則認定場景有物體運動存在.這種檢測算法通過比較相鄰幀的差分值找出兩幀之間的差異,運算簡單,檢測速度快,適用于實時性要求較高的環(huán)境,是一種常用的運動目標檢測算法[3].
為了實現(xiàn)兩幀的比較,設計使用了差異過濾器Difference filters和閾值過濾器Threshold filters.AForge.NET默認的閾值Threshold為15,當然也可以在源碼中修改[4].
//創(chuàng)建過濾器
Difference differenceFilter = new Difference( );
IFilter thresholdFilter = new Threshold( 15 );
//設置背景幀為differenceFilter過濾器的遮罩
differenceFilter.OverlayImage = backgroundFrame;
//應用differenceFilter過濾器
Bitmap tmp1 = differenceFilter.Apply( currentFrame );
Bitmap tmp2 = thresholdFilter.Apply( tmp1 );
通過以上步驟,可以獲得每個bit位的差異.差異點的個數(shù)是可以計數(shù)的,當計數(shù)值大于預先設置的報警閾值時,即可認為出現(xiàn)了運動物體.
3.1.2 噪聲處理
在具體的設計中,需要注意的是大多數(shù)攝像頭所提供的圖像都是有著大量噪聲的,如果不對原生圖像進行預處理就進行比較檢測的話,可能會在根本沒有運動物體時也會產(chǎn)生誤報.因此,需要對帶有噪聲的原生圖像先進行濾波去除噪聲,這里用到了erosionFilter.
//創(chuàng)建過濾器
IFilter erosionFilter = new Erosion( );
//應用過濾器
Bitmap tmp3 = erosionFilter.Apply( tmp2 );
3.1.3 高亮顯示
以上兩步已經(jīng)實現(xiàn)了最簡單的運動檢測.為了獲得更好的效果,還需要對運動區(qū)域進行高亮顯示,這里主要用到了extrachChannel和merge和ReplaceChannel.
//提取原圖的紅色通道
IFilter extrachChannel = new ExtractChannel( RGB.R );
Bitmap redChannel = extrachChannel.Apply( image );
//把紅色通道和運動區(qū)域進行混合
Merge mergeFilter = new Merge( );
mergeFilter.OverlayImage = tmp3;
Bitmap tmp4 = mergeFilter.Apply( redChannel );
//替換原圖中的紅色通道
ReplaceChannel replaceChannel = new ReplaceChannel( RGB.R );
replaceChannel.ChannelImage = tmp4;
Bitmap tmp5 = replaceChannel.Apply( image );
效果如圖1所示,幀圖像中發(fā)生變化的部分用紅色通道標記出來了.但是,從上述算法的實現(xiàn)可以看出,如果物體運動平滑緩慢,前后幀差值過小,就會難以發(fā)現(xiàn)運動物體,這也使得該算法較適用于檢測運動較快的目標.為了解決這一問題,可以適當延長比較幀之間的時間間隔來獲得圖像的差值,以提高檢測的精度.
圖1 幀差分法Fig.1 Frame difference method
背景差分法是將當前圖像與預設的背景模型進行比較,通過判定對應灰度圖差值的大小進行判別.該算法的核心是背景建模,常用的背景建模是利用相鄰圖像找出視頻中不變的部分作為背景,用直方圖等統(tǒng)計信息的變化來判斷是否有異常情況發(fā)生.
建立場景背景的方法[5]很多,但大多都太復雜.本設計使用了一種簡單、快捷的場景背景的建立方法.首先,將整個視頻序列的第一幀作為背景幀,然后將每一幀都和第一個背景幀進行比較,最后把背景幀移到當前幀上,也就是取背景幀像素按照一定的百分比來改變當前幀,用到的主要有MoveTowards過濾器.
//創(chuàng)建過濾器
MoveTowards moveTowardsFilter = new MoveTowards( );
//把背景幀移到當前幀
moveTowardsFilter.OverlayImage = currentFrame;
Bitmap tmp = moveTowardsFilter.Apply( backgroundFrame );
//處理舊的背景
backgroundFrame.Dispose( );
backgroundFrame = tmp;
這樣,就獲得了新的背景,之后的差分操作就比較簡單了,在此不再贅述,效果如圖2所示,幀圖像中發(fā)生變化的部分用紅色通道曲線邊界給予標記.
圖2 背景差分法Fig.2 Backgound difference method
從上述算法的實現(xiàn)可以看出,在背景已知的情況下,背景差法是一種有效的運動目標檢測方法.但需要注意的是,它易受外界條件的影響,背景建模不當時甚至會在沒有運動物體的地方出現(xiàn)誤報.比如,在背景本身就含有運動物體的情況下,會出現(xiàn)當該物體移出后,它原來所在的位置會不斷地被誤報.因此,背景的更新就顯得非常重要,也有相關的算法提出,但還需要進一步完善.
利用開源AForge.NET框架實現(xiàn)了運動目標的檢測功能,探討了差分法主要的設計技術,建立了一種通用性很強的運動目標檢測系統(tǒng),運行穩(wěn)定、可靠、實時性較好,效果較為明顯,達到了設計的目標.文中提到的技術手段具有較強的適用性,稍加擴展即可實現(xiàn)追蹤、報警和動作識別等更高級的應用.
參考文獻:
[1] 張娟.運動目標跟蹤算法研究綜述[J].計算機應用研究,2009,26(12):4407-4410.
[2] 甘明剛.一種基于三幀差分和邊緣信息的運動目標檢測方法[J].電子與信息學報,2010,32(4):849-852.
[3] 王天苓.基于視頻序列的運動目標檢測[J].電子設計工程,2010,18(12):114-116.
[4] 李勁菊.一種復雜背景下運動目標檢測與跟蹤方法[J].儀器儀表學報,2010,31(10):2242-2247.
[5] Andrew Kirillov.Aforge.NET:Framework[EB/OL].http://www.Aforgenet.com,2011-12-20.