預期效果
機器人可以在較為簡單的生活環境背景中,實現對單個人體目標的檢測和實時跟蹤,做出前進、后退、左轉和右轉等基本操作。
運行環境
Windows7、 Visual Studio 2013
EmguCv2.4.9
小R科技-51duino WiFi視頻智能小車機器人(更換加強版的路由模塊)
基本思路
檢測:我們要利用智能小車並不優秀的硬件設備來實現對人體目標的檢測和實時跟蹤,檢測部分我們使用人臉來定位人體,雖然這樣使得智能小車只能識別並跟蹤正面人體,但是由於智能小車視角的原因(視角很低)並且攝像頭和路由模塊傳輸速率有限,沒辦法傳輸高分辨率的圖像,這些外部因素使得我們最終確定使用人臉檢測定位人體目標。但是如果硬件允許的話,這個完全可以將人臉替換成人體目標的檢測。seetaFace引擎是一個開源項目,它的人臉檢測模塊較為准確,並且速度很快。
跟蹤:跟蹤主要是要滿足實時跟蹤,經過對比粒子濾波、Camshift、KCF算法等的優勢和缺點,最終決定選擇Camshift算法。Camshift算法基於顏色概率分布圖進行選擇,所以如果背景顏色和目標顏色很接近的時候會造成一定的干擾。算法的跟蹤算法也可以隨着目標的大小而變化,這對我們通過智能車攝像頭來判斷目標物體的運動狀態是至關重要的。另外,針對我們的具體需求,對算法進行了優化和改進。
為了減少背景色對目標物體的干擾,我們加入了形態學檢測,我們人臉的輪廓長寬比是有一定限制的,在這個比例區間內我們認為跟蹤是成功的,一旦跟蹤目標的矩形區域長寬比例超過這個閾值,我們先暫時忽略掉這一幀,繼續用上一幀更新跟蹤窗口。
僅使用Camshift算法:
這里寫圖片描述
加上形態學檢測:
這里寫圖片描述
如果接連幾幀都超過了閾值,我們就認為跟蹤目標已經丟失,便暫時停止跟蹤,重新檢測定位目標再進行跟蹤。(檢測部分使用seetaFace的檢測模塊,平均檢測時間為十幾ms)
public ObjectTracking(Image<Bgr, Byte> image, Rectangle ROI)
{
// Initialize parameters
trackbox = new MCvBox2D();
trackcomp = new MCvConnectedComp();
hue = new Image<Gray, byte>(image.Width, image.Height);
hue._EqualizeHist();
mask = new Image<Gray, byte>(image.Width, image.Height);
//hist = new DenseHistogram(10, new RangeF(0, 255));
hist = new DenseHistogram(30, new RangeF(0, 180));
backproject = new Image<Gray, byte>(image.Width, image.Height);
// Assign Object's ROI from source image.
trackingWindow = www.vboyule.cn ROI;
// Producing Object's hist
CalObjectHist(image);
}
public Rectangle Tracking(Image<Bgr, Byte> image, MainWindow mw)
{
UpdateHue(image);
// Calucate BackProject
backproject = hist.BackProject(new Image<Gray, Byte>[] { hue });
// Apply mask
backproject._And(mask);
// Tracking windows empty means camshift lost bounding-box last time
// here we give camshift a new start window from 0,0 (you could change it)
if (trackingWindow.IsEmpty www.huazongyule.net || trackingWindow.Width==0 || trackingWindow.Height==0)
{
trackingWindow = new Rectangle(0, 0, 100, 100);
}
CvInvoke.cvCamShift(backproject, trackingWindow,
new MCvTermCriteria(10, 1), out trackcomp, out trackbox);
// update tracking window
int width_ = trackcomp.rect.Width;
int height_ = trackcomp.rect.Height;
//形態學約束
if (height_ >= width_ && (2.5 * width_ - 1.0 * height_ ) > 0.01)
{
trackingWindow = trackcomp.rect;
// retry = 0;
}
else
{
//trackingWindow = www.jiaeidaypt.cn trackcomp.rect;
mw.RobotEngine.SendDataInSocket(mw.CMD_Stop, mw.ControlIp, mw.Port);
mw.hasSendCom = false;
retry++;
if (retry>=6)
{
System.Environment.Exit(www.lieqibiji.com0);
}
//seetaFace重檢測
image.Save("0.jpg");
Process p = new Process();
p.StartInfo.FileName = "HumanDection.exe";
p.StartInfo.Arguments = "0.jpg seeta_fd_frontal_v1.0.bin";
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.Start();
p.WaitForExit();//關鍵,等待外部程序退出后才能往下執行
FileStream fs = new FileStream("www.yihuanyule.cn/face.txt", FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs);
string s = sr.ReadLine();
fs.Close();
string[] strs = s.Split(' ');
trackingWindow.X = int.Parse(strs[0]);
trackingWindow.Y = int.Parse(strs[1]);
trackingWindow.Width = int.Parse(strs[2]);
trackingWindow.Height = int.Parse(strs[3]);
image.Draw(trackingWindow, new Bgr(System.Drawing.Color.Red), 3);//繪制檢測框
}
//trackingWindow = www.wanmeiyuLept.com trackcomp.rect;
return trackingWindow;
智能車控制算法
我們接收到的圖像分辨率的都是640*480,所以我們畫出了下面的矩形框。我們根據跟蹤框的大小變化比例設定一個閾值,當矩形框的面積變化比例超過這個閾值時,我們就控制智能小車前進或者后退;當跟蹤框的中心點的橫坐標處於0~100時,我們進行左轉操作,當中心點處於540~640時,進行右轉操作。
這里寫圖片描述
核心算法
使用seetaFace進行人臉檢測定位人體目標
使用改進的Camshift算法(形態學約束+重檢測)進行跟蹤
使用C#編寫上位機並進行核心運動控制邏輯的編寫
基本流程圖如下:
這里寫圖片描述
運行效果
初始幀檢測
這里寫圖片描述
直行跟蹤
這里寫圖片描述
轉彎跟蹤
這里寫圖片描述
源碼下載
https://github.com/Tachone/ObjectTracking