为什么遗留库中的openCV中的CvBlobDetector?

时间:2011-10-22 14:51:47

标签: opencv

是否有更新的blob检测/跟踪库?

这不是一个好的图书馆吗?

遗产应该是旧的而不是有用的代码吗?

有人知道吗?

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

这是我用来跟踪Emgucv 3.1版本

中的blob的代码
//MCvFont font = new MCvFont(Emgu.CV.CvEnum.FontFace.HersheySimplex, 0.5, 0.5);
 using (CvTracks tracks = new CvTracks())
 using (ImageViewer viewer = new ImageViewer())
 using (Capture capture = new Capture())
 using (Mat fgMask = new Mat())
 {
  //BGStatModel<Bgr> bgModel = new BGStatModel<Bgr>(capture.QueryFrame(), Emgu.CV.CvEnum.BG_STAT_TYPE.GAUSSIAN_BG_MODEL);
   BackgroundSubtractorMOG2 bgModel = new BackgroundSubtractorMOG2(0, 0, true);
   //BackgroundSubstractorMOG bgModel = new BackgroundSubstractorMOG(0, 0, 0, 0);

   capture.ImageGrabbed += delegate(object sender, EventArgs e)
    {
       Mat frame = new Mat();
       capture.Retrieve(frame);
       bgModel.Apply(frame, fgMask);

        using (CvBlobDetector detector = new CvBlobDetector())
                using (CvBlobs blobs = new CvBlobs())
                {
                    detector.Detect(fgMask.ToImage<Gray, Byte>(), blobs);
                    blobs.FilterByArea(100, int.MaxValue);

                    tracks.Update(blobs, 20.0, 10, 0);

                    Image<Bgr, Byte> result = new Image<Bgr, byte>(frame.Size);

                    using (Image<Gray, Byte> blobMask = detector.DrawBlobsMask(blobs))
                    {
                        frame.CopyTo(result, blobMask);
                    }
                    //CvInvoke.cvCopy(frame, result, blobMask);

                    foreach (KeyValuePair<uint, CvTrack> pair in tracks)
                    {
                        if (pair.Value.Inactive == 0) //only draw the active tracks.
                        {
                            CvBlob b = blobs[pair.Value.BlobLabel];
                            Bgr color = detector.MeanColor(b, frame.ToImage<Bgr, Byte>());
                            result.Draw(pair.Key.ToString(), pair.Value.BoundingBox.Location, Emgu.CV.CvEnum.FontFace.HersheySimplex, 0.5, color);
                            result.Draw(pair.Value.BoundingBox, color, 2);
                            Point[] contour = b.GetContour();
                            result.Draw(contour, new Bgr(0, 0, 255), 1);
                        }
                    }

                    viewer.Image = frame.ToImage<Bgr, Byte>().ConcateVertical(fgMask.ToImage<Bgr, Byte>().ConcateHorizontal(result));
                }
            };
            capture.Start();
            viewer.ShowDialog();
        }