使用BlobTrackerAuto跟踪计算机视觉应用中的人

时间:2012-05-23 13:41:20

标签: opencv computer-vision emgucv

我目前正在尝试使用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()。我有几个问题:

  1. 视频以场景中的几个人开始。当视频开始时,我没有得到与场景中人物相对应的斑点。
  2. 有时我会失去&#34;一个人几帧:我在一个人周围画了几个秒/帧的红色矩形,它消失了,过了一会儿再用不同的ID画出来。
  3. 从示例代码中可以看出,我检查blob是否是检查其高度和宽度的人(isPersonSize()方法),并仅在传入测试的那些中绘制红色矩形。如何删除非人员大小的?
  4. 我想测量一个人留在场景中的时间。什么是了解斑点何时消失的最佳方法?我应该存储我认为对应于数组中人员的blob的ID,并在每个循环中使用tracker.GetBlobByID()检查每个blob是否仍在那里?
  5. 如果我不处理循环中的每一帧,我想我的结果会更好。我添加了一个计数器变量和一个if语句来处理每3帧:

    if (i % 3 == 0)
        tracker.Process(frame, foreground);
    
  6. 我添加了if语句,因为程序执行速度很慢。但是当我这样做时,我能够跟踪那些我之前无法做到的人。

    总而言之,如果有人更习惯OpenCV / EmguCV,我会非常感激,如果这是一个很好的方法来跟踪使用BlobTrackerAuto的人,并帮助我解决上述问题。我觉得我没有利用EmguCV可以提供给我的工具。

0 个答案:

没有答案