徐智廣 周杏櫻
摘要:傳統(tǒng)的皮帶機(jī)計算器在一個通道內(nèi)無法同時識別多個目標(biāo),本文使用AForge.NET視頻圖像處理類庫來介紹怎樣使用視頻識別技術(shù)檢測多個運動目標(biāo)并實現(xiàn)自動計數(shù)的功能,本文著重于算法的設(shè)計及實現(xiàn)方法。
關(guān)鍵詞:圖像識別;多運動目標(biāo)計數(shù);皮帶機(jī)計數(shù)器;計算機(jī)視覺;AForge.NET
中圖分類號:TP391 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2016)13-0197-04
1概述
傳統(tǒng)的皮帶機(jī)計數(shù)器是采用紅外傳感器安裝固定在傳送帶的兩側(cè),一端發(fā)射紅外線、另一端接收此紅外線信號,當(dāng)目標(biāo)物品從中間通過遮擋到紅外線時,會觸發(fā)計數(shù)器進(jìn)行計數(shù)。由此計數(shù)器的工作原理可知,被測目標(biāo)物品通常比較大件且傳送帶是單通道,目標(biāo)物品一個一個地依次通過紅外傳感器進(jìn)行計數(shù),如果被測目標(biāo)物品體積細(xì)薄且數(shù)量較多需要在傳送帶上批量計數(shù)的時候,傳統(tǒng)的皮帶機(jī)計數(shù)器將難以解決。
如今視頻識別伴隨計算機(jī)技術(shù)的高速發(fā)展其技術(shù)日臻成熟,廣泛應(yīng)用于現(xiàn)代加工制造業(yè),本文介紹一種利用視頻識別進(jìn)行多運動目標(biāo)檢測自動計數(shù)的算法設(shè)計及實現(xiàn)方法。
2視頻識別檢測方法
2.1運動目標(biāo)檢測方法
目前視頻識別使用的運動目標(biāo)檢測方法有以下幾種:幀差法、背景差法、光流法等。通過實踐證明使用幀差法能更有效地檢測高速運動的目標(biāo),在此著重介紹幀差法的原理,幀差法是指將運動圖像序列中相鄰的兩幀作差分運算來獲取運動目標(biāo)輪廓的方法,該方法算法簡單檢測速度快,適用于多個運動目標(biāo)檢測和實時性較強(qiáng)的應(yīng)用場合。因此本文使用幀差法。
本文的視頻識別處理過程就是對幀差法產(chǎn)生的一系列圖像進(jìn)行圖像識別分析處理,就是一個持續(xù)的圖像處理過程。
2.2 AForge.NET編程框架類庫
AForge.NET是一個基于C#語言開發(fā)的視頻和圖像處理的開源類庫,它包括了計算機(jī)視覺的各種基本算法,例如:圖像處像和濾鏡過濾,機(jī)器學(xué)習(xí)、模糊推理和視頻處理等。
本文主要引用AForge.NET類庫中的1.AForge.Imaging:圖像處理和濾鏡類庫;2.AForge.Vision:計算機(jī)視覺應(yīng)用類庫;3.AForge.Video:視頻處理類庫。引用成熟AForge.NET視頻和圖像處理類庫可以使開發(fā)者更專注于實際圖像識別的算法本身,而不需要構(gòu)建一個完整的圖像處理數(shù)學(xué)模型。
本文軟件系統(tǒng)環(huán)境為微軟VS2012,C#編程語言,使用AForge.NET 2.2.5版本類庫,硬件為USB接口的工業(yè)高速攝像槍,達(dá)到60幀/秒。
3算法設(shè)計與編程方法
我們把小型電路板作為待測計量的目標(biāo)物體,把一堆小型電路板放到皮帶機(jī)輸送帶上,此時攝像頭進(jìn)行拍攝,計算機(jī)服務(wù)器程序開始使用幀差法處理拍攝的圖像隊列。
3.1應(yīng)用濾鏡檢測目標(biāo)輪廓路徑
為了檢測出在皮帶機(jī)上的電路板,我們使用一些圖像濾鏡對圖像目標(biāo)進(jìn)行處理,首先圖像需要進(jìn)行灰度化,其作用是將彩色圖像變成黑白灰色,有的攝像槍可以直接調(diào)節(jié)為黑白模式則可省略本步驟的過濾處理,減少資源的消耗;然后再對灰度化的圖像進(jìn)行二值化過濾,目的是使圖像變成只有黑白色;再利用邊緣路徑檢測函數(shù)對圖像上所有的小型電路板輪廓路徑進(jìn)行檢測,得到電路板的邊緣的閉合路徑圖。算法程序如下:
FiltersSequence seq = new FiltersSequence();//使用過濾
seq.Add(Grayscale.CommonAlgorithms.BT709); //添加灰度濾鏡,把彩色變灰色
seq.Add(new Threshold(150)); //基于閥值的二值化,即結(jié)果不是黑就是白
seq.Add(new OilPainting(10)); //邊緣填充,使更好地閉合
Seq.Add(new DifferenceEdgeDetector());//邊緣路徑檢測
得到如下圖所示一個個長方形的閉合路徑,即為小型電路板的輪廓路徑模型。下圖為應(yīng)用一連串的濾鏡后的圖像變化結(jié)果。
3.2提取閉合路徑圖像塊模型數(shù)組
在上圖中最后濾鏡處理(路徑檢測)其結(jié)果顯示的每一個閉合長方形就是一個小型電路板輪廓模型,通過blobCounter類函數(shù),對整個圖像的所有閉合路徑進(jìn)行提取。為了去除干擾的因素和提高準(zhǔn)確性,我們對提取圖像塊的最小寬度、最小高度以及圖像塊面積進(jìn)行了過濾,通過了過濾的圖像塊數(shù)組則為圖像上所有小型電路板的模型。算法程序如下:
blobCounter.FilterBlobs = true; //開啟過濾條件
blobCounter.MinWidth = 40; //設(shè)置最小像素寬度
blobCounter.MinHeight = 40; //設(shè)置最小像素高度
blobCounter.ObjectsOrder = ObjectsOrder.Area;
blobCounter.ProcessImage(image); //篩選出有效的對象
Blob[] blobs = blobCounter.GetObjectsInformation();//提取圖像上所有閉合路徑作為圖像塊數(shù)組。
提取的閉合路徑圖像塊模型數(shù)組存在于程序的內(nèi)存中,現(xiàn)階段沒有進(jìn)行圖形顯示。
3.3獲取圖像塊的中心點。
根據(jù)皮帶機(jī)的單方向運動的特點,我們在圖像畫布上畫兩條虛擬的起始線和結(jié)束線,圖像塊總從紅線上向下運動,最后穿過綠線。為了方便追蹤檢測,我們以圖像塊中心點來代表一個圖像塊,然后只要監(jiān)測中心點的運動情況即可,當(dāng)中心點經(jīng)過紅線的時候進(jìn)行追蹤檢測記錄,當(dāng)中心點通過綠線之后進(jìn)行統(tǒng)計數(shù)量加1,如下圖所示:
中心點在程序上以XY坐標(biāo)值來表示,算法程序如下。
foreach (Blob blob in blobs) //遍歷圖像塊數(shù)組
{List
blobCounter.GetBlobsLeftAndRightEdges(blob,out leftPoints, out rightPoints); //獲取圖像塊左右邊緣坐標(biāo)
edgePoints = blobCounter.GetBlobsEdgePoints(blob); //獲取圖像塊邊緣坐標(biāo)
edgePoints.AddRange(leftPoints); //添加左邊緣坐標(biāo)
edgePoints.AddRange(rightPoints); //添加右邊緣坐標(biāo)
int minX=0, maxY=0, maxX=0, minY=0; //定義XY軸坐標(biāo)的最大最小值變量
if (edgePoints.Count > 0)
{minX = maxX = edgePoints[0].X;
maxY = minY = edgePoints[0].Y;
foreach (IntPoint pointx in edgePoints) //判斷當(dāng)前坐標(biāo)是否越界限。
{ if (minX > pointx.X) minX = pointx.X;
if (maxX < pointx.X) maxX = pointx.X;
if (minY > pointx.Y) minY = pointx.Y;
if (maxY < pointx.Y) maxY = pointx.Y; } }
centerX = (maxX - minX) / 2 + minX; //中心X軸坐標(biāo)
centerY = (maxY - minY) / 2 + minY; }//中心Y軸坐標(biāo)
當(dāng)圖像塊從上到下穿過紅色開始線時,就將中心點的XY坐標(biāo)值進(jìn)行記錄。為了記錄每個圖像塊的坐標(biāo)等信息,我們建立了一個TrackBlock類來表示圖像塊模型,以下為TrackBlock類的私有成員變量。
public class TrackBlock
{ private int avgX;//圖像塊中心點的X軸坐標(biāo)
private int avgY;//圖像塊中心點的Y軸坐標(biāo)
private int checkLine1 = 40;//起始紅線的Y軸坐標(biāo)
private int checkLine2 = 420; //結(jié)束綠線的Y軸坐標(biāo)
private bool isCheckLine1 = false;//記錄該Y軸坐標(biāo)是否已經(jīng)超過了checkLine1的值
private bool isCheckLine2 = false;// 記錄該Y軸坐標(biāo)是否已經(jīng)超過了checkLine2的值
……
}
TrackBlock實體類將記錄于List
3.4幀差法中心點的運動軌跡統(tǒng)計算法
由于圖像塊中心點的運動軌跡總是往向下運動,在計算機(jī)程序的圖像處理上,即中心點的X軸坐標(biāo)不變,Y軸坐標(biāo)增加。對以60幀/秒速度產(chǎn)生的幀差圖像以及皮帶機(jī)的每秒傳送速度,可以計算出圖像塊中心點坐標(biāo)兩幀之間X軸允許10像素的絕對值偏差,Y軸為運動方向允許120像素的正偏差,其中允許X軸偏差是攝像頭測量精度及皮帶機(jī)會震動的原因,而Y軸的兩幀偏差值與皮帶機(jī)的運動速度有關(guān)。如果檢測到中心點X軸偏移太大,或者位移太快,都認(rèn)為是無效追蹤到的中心點,則不參與計數(shù),如下圖所示。
由于畫布上有多個運動的圖像塊,有剛出現(xiàn)的,也有已完成計數(shù)消失的,我們需要對應(yīng)地識別出該圖像塊是新紀(jì)錄還是已有記錄,方法為遍歷每個圖像塊中心坐標(biāo)的值和當(dāng)前已有泛型類集合(listBlock)中的中心坐標(biāo)的X軸Y軸值的差,是否在上述XY軸的允許偏差范圍內(nèi)。如中心點的坐標(biāo)偏差在允許范圍內(nèi)則更新泛型類集合中心點的坐標(biāo)值,如果不存在記錄則新增記錄。程序算法如下:
for (int i = 0; i < listBlock.Count; i++)//循環(huán)泛型類集合
{//查找是否存在記錄,更新中心點
if (centerX < maxX && centerX > minX && centerY < maxY && centerY > minY)//中心點坐標(biāo)必須在最大最少坐標(biāo)值的范圍內(nèi)
{ //中心點必須要范圍內(nèi)X軸允許10像素的絕對值偏差,Y軸為運動方向允許120像素的正偏差,
if (listBlock[i].AvgX > 0 && listBlock[i].AvgY > 0 && Math.Abs(centerX - listBlock[i].AvgX) <10 && Math.Abs(centerY - listBlock[i].AvgY) < 120 && listBlock[i].IsExist)
{ listBlock[i].AvgX = centerX;//更新中心點的信息
listBlock[i].AvgY = centerY;
isExist = true;//標(biāo)識為已存在記錄
break; }}}
//不存在符合條件,則新增記錄
if (!isExist)
{ //新增條件, 中心點Y值必須要在第一條橫線之前出現(xiàn),即值小于50;
if (50 - centerY > 5) //5像素為一個相對的誤差值
{ TrackBlock trackBlock = new TrackBlock();
trackBlock.AvgX = centerX;
trackBlock.AvgY = centerY;
trackBlock.IsExist = true;
listBlock.Add(trackBlock); }}
在更新中心點的信息時,就會觸發(fā)TrackBlock類中AvgY的賦值函數(shù)。賦值函數(shù)中將實時中心點Y值與設(shè)定的紅色開始線的Y值(checkLine1)比較,當(dāng)中心點Y值大于紅線Y值且IsCheckLine1 =false且IsCheckLine2=false(沒有穿過紅線而且也沒有穿過綠線),則IsCheckLine1 =true表示該圖像塊已經(jīng)進(jìn)入了追蹤檢測的范圍。
如果大于綠線Y值且IsCheckLine1 =true(已經(jīng)穿過了紅線)且IsCheckLine2=false(沒有穿過綠線)則IsCheckLine2=true。算法程序如下:
public int AvgY
{get
return avgY;
set
{ avgY = value;
//檢測是否通過了開始線
if (!IsCheckLine1 && !IsCheckLine2)// 原來并沒有穿過紅色開始線或是綠色結(jié)束線,即新出現(xiàn)的記錄
{if (value - checkLine1 > 2) //大于2像素,2像素表示一個相對的誤差范圍值
{IsCheckLine1 = true; }}
//檢測是否通過了結(jié)束線
if (IsCheckLine1 && !IsCheckLine2)// 已經(jīng)穿過了紅色開始線但之前沒有穿過綠色結(jié)束線
{if (value - checkLine2 > 2) //大于2像素,2像素表示一個相對的誤差范圍值
{IsCheckLine2 = true; }}}}
當(dāng)IsCheckLine2等于true,表示穿過了結(jié)束線,可以進(jìn)行計數(shù)加1,并在泛型類集合中刪除該中心點的實體類。至此整個視頻識別在皮帶機(jī)上運動計數(shù)的算法設(shè)計就完成了。
4目標(biāo)物品堆疊的處理
在進(jìn)行大規(guī)模的自動計數(shù)的時候,被測物體電路板會被大批倒在皮帶機(jī)上,其不規(guī)則的擺放會導(dǎo)致電路板在皮帶機(jī)上產(chǎn)生堆疊的情況,在此情況下自動計數(shù)將不能使用像上述理想模型的處理方法。為此我們需要在皮帶機(jī)上增加物理過濾以及改進(jìn)物體輪廓提取的算法。
4.1篩選過濾裝置
對于被測物體可能產(chǎn)生的堆疊情況,可以在皮帶上放置一個擋板來限制被測物體的高度,使用雙擋板可以確保消除物體的堆疊情況。
對于被測物體可能互相重疊的情況會影響到視頻識別的追蹤檢測,可以在皮帶機(jī)上放置一個導(dǎo)航間隔欄來引導(dǎo)和打散被測物體,見下圖。
4.2程序算法的篩選過濾處理
在使用blobCounter類提取圖像塊的時候,可以設(shè)定過濾條件,對于只有二個目標(biāo)物體之間的重疊,是可以通過寬度高度和面積像素大小的情況進(jìn)行識別,但對三個以上的物體重疊情況則比較復(fù)雜,因為重疊之后計算機(jī)并沒有獲取到全部的圖像信息,基于二維圖像分析blobCounter類庫沒有辦法實現(xiàn)自動識別,閉合路徑檢測會把多個重疊的目標(biāo)閉合組成了一個。
對于規(guī)則的目標(biāo)物體可以使用ExhaustiveTemplateMatching基于模板的圖像匹配函數(shù)來查找。即把目標(biāo)物體作為模板來查找整個圖像中的匹配情況。但對于過度重疊和堆疊的目標(biāo)物品,需要開發(fā)更復(fù)雜的算法,現(xiàn)結(jié)合物理上的篩選過濾裝置可以分離出獨立運動的被測目標(biāo)物體。
5結(jié)束語
本文使用幀差法作為視頻運動目標(biāo)檢測,使用了AForge.NET類庫的灰度化、二值化、路徑檢測、圖像塊提取等圖像處理技術(shù)方法,使計算機(jī)獲取到了目標(biāo)物體的模型坐標(biāo),通過對目標(biāo)物體中心點坐標(biāo)的持續(xù)追蹤檢測,實現(xiàn)了自動計數(shù)的功能。
本文著重于實現(xiàn)算法的本身,程序經(jīng)過大量試驗并多次修正,能實現(xiàn)自動計數(shù)的功能。對于運動目標(biāo)重疊堆疊嚴(yán)重的情況,程序未能完全進(jìn)行自動識別檢測,需要借助物理上的篩選過濾裝置處理,但對于研究視頻識別多個運動目標(biāo)的檢測或在皮帶機(jī)上多運動目標(biāo)計數(shù)的工業(yè)應(yīng)用,具有一定的借鑒意義。
參考文獻(xiàn):
[1] 樓亮亮,金彥亮. 基于AForge.NET類庫的視頻移動目標(biāo)檢測[J].現(xiàn)代電子技術(shù),2015,38(17):58-60.
[3] 謝樹煜,陳倩,朱虹. 實時視頻對象識別與計數(shù)系統(tǒng)的模型和算法設(shè)計[J].清華大學(xué)學(xué)報:自然科學(xué)版,2001,41(7):61-64.