我目前正在尝试使用EmguCV(OpenCV Wrapper)开发一个跟踪队列中人员的系统。我开始运行并了解我下载的Emgu包中的VideoSurveilance示例。以下是基于示例的代码:
private static void processVideo(string fileName)
{
Capture capture = new Capture(fileName);
MCvFont font = new MCvFont(Emgu.CV.CvEnum.FONT.CV_FONT_HERSHEY_SIMPLEX,
1.0, 1.0);
BlobTrackerAuto<Bgr> tracker = new BlobTrackerAuto<Bgr>();
//I'm using a class that I implemented for foreground segmentation
MyForegroundExtractor fgExtractor = new MyForegroundExtractor();
Image<Bgr, Byte> frame = vVideo.QueryFrame();
fgExtractor.initialize(frame);
while (frame != null)
{
Image<Gray, Byte> foreground = fgExtractor.getForegroundImg(frame);
tracker.Process(frame, foreground);
foreach (MCvBlob blob in tracker)
{
if (isPersonSize(blob))
{
frame.Draw((Rectangle)blob, new Bgr(0, 0, 255), 3);
frame.Draw(blob.ID.ToString(), ref font,
Point.Round(blob.Center), new Bgr(255.0, 255.0, 255.0));
}
}
CvInvoke.cvShowImage("window", frame);
CvInvoke.cvWaitKey(1);
frame = capture.QueryFrame();
}
}
以上代码用于处理AVI视频的每个帧,并在场景中的每个人周围显示带有红色矩形的已处理帧。我不喜欢使用VideoSurveilance示例中使用的IBGFGDetector<Bgr>
类获得的结果,因此我尝试使用我自己的前景检测器,使用Emgu的函数,如CvInvoke.cvRunningAvg (),CvInvoke.cvAbsDiff(),CvInvoke.cvThreshold()和cvErode / cvDilate()。我有几个问题:
tracker.GetBlobByID()
检查每个blob是否仍在那里?如果我不处理循环中的每一帧,我想我的结果会更好。我添加了一个计数器变量和一个if语句来处理每3帧:
if (i % 3 == 0)
tracker.Process(frame, foreground);
我添加了if语句,因为程序执行速度很慢。但是当我这样做时,我能够跟踪那些我之前无法做到的人。
总而言之,如果有人更习惯OpenCV / EmguCV,我会非常感激,如果这是一个很好的方法来跟踪使用BlobTrackerAuto的人,并帮助我解决上述问题。我觉得我没有利用EmguCV可以提供给我的工具。