靜網PWA視頻評論

視頻識別在皮帶機上運動計數的算法設計

2023年10月29日

- txt下載

徐智廣 周杏櫻
摘要:傳統的皮帶機計算器在一個通道內無法同時識別多個目標,本文使用AForge.NET視頻圖像處理類庫來介紹怎樣使用視頻識別技術檢測多個運動目標並實現自動計數的功能,本文著重於算法的設計及實現方法。
關鍵詞:圖像識別;多運動目標計數;皮帶機計數器;計算機視覺;AForge.NET
中圖分類號:TP391 文獻標識碼:A 文章編號:1009-3044(2016)13-0197-04
1概述
傳統的皮帶機計數器是採用紅外傳感器安裝固定在傳送帶的兩側,一端發射紅外線、另一端接收此紅外線信號,當目標物品從中間通過遮擋到紅外線時,會觸發計數器進行計數。由此計數器的工作原理可知,被測目標物品通常比較大件且傳送帶是單通道,目標物品一個一個地依次通過紅外傳感器進行計數,如果被測目標物品體積細薄且數量較多需要在傳送帶上批量計數的時候,傳統的皮帶機計數器將難以解決。
如今視頻識別伴隨計算機技術的高速發展其技術日臻成熟,廣泛應用於現代加工製造業,本文介紹一種利用視頻識別進行多運動目標檢測自動計數的算法設計及實現方法。
2視頻識別檢測方法
2.1運動目標檢測方法
目前視頻識別使用的運動目標檢測方法有以下幾種:幀差法、背景差法、光流法等。通過實踐證明使用幀差法能更有效地檢測高速運動的目標,在此著重介紹幀差法的原理,幀差法是指將運動圖像序列中相鄰的兩幀作差分運算來獲取運動目標輪廓的方法,該方法算法簡單檢測速度快,適用於多個運動目標檢測和實時性較強的應用場合。因此本文使用幀差法。
本文的視頻識別處理過程就是對幀差法產生的一系列圖像進行圖像識別分析處理,就是一個持續的圖像處理過程。
2.2 AForge.NET編程框架類庫
AForge.NET是一個基於C#語言開發的視頻和圖像處理的開源類庫,它包括了計算機視覺的各種基本算法,例如:圖像處像和濾鏡過濾,機器學習、模糊推理和視頻處理等。
本文主要引用AForge.NET類庫中的1.AForge.Imaging:圖像處理和濾鏡類庫;2.AForge.Vision:計算機視覺應用類庫;3.AForge.Video:視頻處理類庫。引用成熟AForge.NET視頻和圖像處理類庫可以使開發者更專注於實際圖像識別的算法本身,而不需要構建一個完整的圖像處理數學模型。
本文軟體系統環境為微軟VS2012,C#程式語言,使用AForge.NET 2.2.5版本類庫,硬體為USB接口的工業高速攝像槍,達到60幀/秒。
3算法設計與編程方法
我們把小型電路板作為待測計量的目標物體,把一堆小型電路板放到皮帶機輸送帶上,此時攝像頭進行拍攝,計算機伺服器程序開始使用幀差法處理拍攝的圖像隊列。
3.1應用濾鏡檢測目標輪廓路徑
為了檢測出在皮帶機上的電路板,我們使用一些圖像濾鏡對圖像目標進行處理,首先圖像需要進行灰度化,其作用是將彩色圖像變成黑白灰色,有的攝像槍可以直接調節為黑白模式則可省略本步驟的過濾處理,減少資源的消耗;然後再對灰度化的圖像進行二值化過濾,目的是使圖像變成只有黑白色;再利用邊緣路徑檢測函數對圖像上所有的小型電路板輪廓路徑進行檢測,得到電路板的邊緣的閉合路徑圖。算法程序如下:
FiltersSequence seq = new FiltersSequence();//使用過濾
seq.Add(Grayscale.CommonAlgorithms.BT709); //添加灰度濾鏡,把彩色變灰色
seq.Add(new Threshold(150)); //基於閥值的二值化,即結果不是黑就是白
seq.Add(new OilPainting(10)); //邊緣填充,使更好地閉合
Seq.Add(new DifferenceEdgeDetector());//邊緣路徑檢測
得到如下圖所示一個個長方形的閉合路徑,即為小型電路板的輪廓路徑模型。下圖為應用一連串的濾鏡後的圖像變化結果。
3.2提取閉合路徑圖像塊模型數組
在上圖中最後濾鏡處理(路徑檢測)其結果顯示的每一個閉合長方形就是一個小型電路板輪廓模型,通過blobCounter類函數,對整個圖像的所有閉合路徑進行提取。為了去除干擾的因素和提高準確性,我們對提取圖像塊的最小寬度、最小高度以及圖像塊面積進行了過濾,通過了過濾的圖像塊數組則為圖像上所有小型電路板的模型。算法程序如下:
blobCounter.FilterBlobs = true; //開啟過濾條件
blobCounter.MinWidth = 40; //設置最小像素寬度
blobCounter.MinHeight = 40; //設置最小像素高度
blobCounter.ObjectsOrder = ObjectsOrder.Area;
blobCounter.ProcessImage(image); //篩選出有效的對象
Blob[] blobs = blobCounter.GetObjectsInformation();//提取圖像上所有閉合路徑作為圖像塊數組。
提取的閉合路徑圖像塊模型數組存在於程序的內存中,現階段沒有進行圖形顯示。
3.3獲取圖像塊的中心點。
根據皮帶機的單方向運動的特點,我們在圖像畫布上畫兩條虛擬的起始線和結束線,圖像塊總從紅線上向下運動,最後穿過綠線。為了方便追蹤檢測,我們以圖像塊中心點來代表一個圖像塊,然後只要監測中心點的運動情況即可,當中心點經過紅線的時候進行追蹤檢測記錄,當中心點通過綠線之後進行統計數量加1,如下圖所示:
中心點在程序上以XY坐標值來表示,算法程序如下。
foreach (Blob blob in blobs) //遍歷圖像塊數組
{ListleftPoints, rightPoints, edgePoints; //定義泛形坐標點
blobCounter.GetBlobsLeftAndRightEdges(blob,out leftPoints, out rightPoints); //獲取圖像塊左右邊緣坐標
edgePoints = blobCounter.GetBlobsEdgePoints(blob); //獲取圖像塊邊緣坐標
edgePoints.AddRange(leftPoints); //添加左邊緣坐標
edgePoints.AddRange(rightPoints); //添加右邊緣坐標
int minX=0, maxY=0, maxX=0, minY=0; //定義XY軸坐標的最大最小值變量
if (edgePoints.Count > 0)
{minX = maxX = edgePoints[0].X;
maxY = minY = edgePoints[0].Y;
foreach (IntPoint pointx in edgePoints) //判斷當前坐標是否越界限。
{ 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軸坐標
centerY = (maxY - minY) / 2 + minY; }//中心Y軸坐標
當圖像塊從上到下穿過紅色開始線時,就將中心點的XY坐標值進行記錄。為了記錄每個圖像塊的坐標等信息,我們建立了一個TrackBlock類來表示圖像塊模型,以下為TrackBlock類的私有成員變量。
public class TrackBlock
{ private int avgX;//圖像塊中心點的X軸坐標
private int avgY;//圖像塊中心點的Y軸坐標
private int checkLine1 = 40;//起始紅線的Y軸坐標
private int checkLine2 = 420; //結束綠線的Y軸坐標
private bool isCheckLine1 = false;//記錄該Y軸坐標是否已經超過了checkLine1的值
private bool isCheckLine2 = false;// 記錄該Y軸坐標是否已經超過了checkLine2的值
……
}
TrackBlock實體類將記錄於List listBlock 這個泛型類集合中。
3.4幀差法中心點的運動軌跡統計算法
由於圖像塊中心點的運動軌跡總是往向下運動,在電腦程式的圖像處理上,即中心點的X軸坐標不變,Y軸坐標增加。對以60幀/秒速度產生的幀差圖像以及皮帶機的每秒傳送速度,可以計算出圖像塊中心點坐標兩幀之間X軸允許10像素的絕對值偏差,Y軸為運動方向允許120像素的正偏差,其中允許X軸偏差是攝像頭測量精度及皮帶機會震動的原因,而Y軸的兩幀偏差值與皮帶機的運動速度有關。如果檢測到中心點X軸偏移太大,或者位移太快,都認為是無效追蹤到的中心點,則不參與計數,如下圖所示。
由於畫布上有多個運動的圖像塊,有剛出現的,也有已完成計數消失的,我們需要對應地識別出該圖像塊是新紀錄還是已有記錄,方法為遍歷每個圖像塊中心坐標的值和當前已有泛型類集合(listBlock)中的中心坐標的X軸Y軸值的差,是否在上述XY軸的允許偏差範圍內。如中心點的坐標偏差在允許範圍內則更新泛型類集合中心點的坐標值,如果不存在記錄則新增記錄。程序算法如下:
for (int i = 0; i < listBlock.Count; i++)//循環泛型類集合
{//查找是否存在記錄,更新中心點
if (centerX < maxX && centerX > minX && centerY < maxY && centerY > minY)//中心點坐標必須在最大最少坐標值的範圍內
{ //中心點必須要範圍內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;//標識為已存在記錄
break; }}}


//不存在符合條件,則新增記錄
if (!isExist)
{ //新增條件, 中心點Y值必須要在第一條橫線之前出現,即值小於50;
if (50 - centerY > 5) //5像素為一個相對的誤差值
{ TrackBlock trackBlock = new TrackBlock();
trackBlock.AvgX = centerX;
trackBlock.AvgY = centerY;
trackBlock.IsExist = true;
listBlock.Add(trackBlock); }}
在更新中心點的信息時,就會觸發TrackBlock類中AvgY的賦值函數。賦值函數中將實時中心點Y值與設定的紅色開始線的Y值(checkLine1)比較,當中心點Y值大於紅線Y值且IsCheckLine1 =false且IsCheckLine2=false(沒有穿過紅線而且也沒有穿過綠線),則IsCheckLine1 =true表示該圖像塊已經進入了追蹤檢測的範圍。
如果大於綠線Y值且IsCheckLine1 =true(已經穿過了紅線)且IsCheckLine2=false(沒有穿過綠線)則IsCheckLine2=true。算法程序如下:
public int AvgY
{get
return avgY;
set
{ avgY = value;
//檢測是否通過了開始線
if (!IsCheckLine1 && !IsCheckLine2)// 原來並沒有穿過紅色開始線或是綠色結束線,即新出現的記錄
{if (value - checkLine1 > 2) //大於2像素,2像素表示一個相對的誤差範圍值
{IsCheckLine1 = true; }}
//檢測是否通過了結束線
if (IsCheckLine1 && !IsCheckLine2)// 已經穿過了紅色開始線但之前沒有穿過綠色結束線
{if (value - checkLine2 > 2) //大於2像素,2像素表示一個相對的誤差範圍值
{IsCheckLine2 = true; }}}}
當IsCheckLine2等於true,表示穿過了結束線,可以進行計數加1,並在泛型類集合中刪除該中心點的實體類。至此整個視頻識別在皮帶機上運動計數的算法設計就完成了。
4目標物品堆疊的處理
在進行大規模的自動計數的時候,被測物體電路板會被大批倒在皮帶機上,其不規則的擺放會導致電路板在皮帶機上產生堆疊的情況,在此情況下自動計數將不能使用像上述理想模型的處理方法。為此我們需要在皮帶機上增加物理過濾以及改進物體輪廓提取的算法。
4.1篩選過濾裝置
對於被測物體可能產生的堆疊情況,可以在皮帶上放置一個擋板來限制被測物體的高度,使用雙擋板可以確保消除物體的堆疊情況。
對於被測物體可能互相重疊的情況會影響到視頻識別的追蹤檢測,可以在皮帶機上放置一個導航間隔欄來引導和打散被測物體,見下圖。
4.2程序算法的篩選過濾處理
在使用blobCounter類提取圖像塊的時候,可以設定過濾條件,對於只有二個目標物體之間的重疊,是可以通過寬度高度和面積像素大小的情況進行識別,但對三個以上的物體重疊情況則比較複雜,因為重疊之後計算機並沒有獲取到全部的圖像信息,基於二維圖像分析blobCounter類庫沒有辦法實現自動識別,閉合路徑檢測會把多個重疊的目標閉合組成了一個。
對於規則的目標物體可以使用ExhaustiveTemplateMatching基於模板的圖像匹配函數來查找。即把目標物體作為模板來查找整個圖像中的匹配情況。但對於過度重疊和堆疊的目標物品,需要開發更複雜的算法,現結合物理上的篩選過濾裝置可以分離出獨立運動的被測目標物體。
5結束語
本文使用幀差法作為視頻運動目標檢測,使用了AForge.NET類庫的灰度化、二值化、路徑檢測、圖像塊提取等圖像處理技術方法,使計算機獲取到了目標物體的模型坐標,通過對目標物體中心點坐標的持續追蹤檢測,實現了自動計數的功能。
本文著重於實現算法的本身,程序經過大量試驗並多次修正,能實現自動計數的功能。對於運動目標重疊堆疊嚴重的情況,程序未能完全進行自動識別檢測,需要藉助物理上的篩選過濾裝置處理,但對於研究視頻識別多個運動目標的檢測或在皮帶機上多運動目標計數的工業應用,具有一定的借鑑意義。
參考文獻:
[1] 樓亮亮,金彥亮. 基於AForge.NET類庫的視頻移動目標檢測[J].現代電子技術,2015,38(17):58-60.
[3] 謝樹煜,陳倩,朱虹. 實時視頻對象識別與計數系統的模型和算法設計[J].清華大學學報:自然科學版,2001,41(7):61-64.

收藏

相關推薦

清純唯美圖片大全

字典網 - 試題庫 - 元問答 - 简体 - 頂部

Copyright © cnj8 All Rights Reserved.