Как сделать отслеживание белых пятен для захвата видео или камеры на Emgu? - PullRequest
0 голосов
/ 18 апреля 2010

Я хочу создать программу на C # с Emgu, которая может обнаруживать белые пятна на изображениях с камеры, а также отслеживать их. Также программа может возвращать идентификаторы отслеживаемых BLOB-объектов

Frame1: http://www.freeimagehosting.net/uploads/ff2ac19054.jpg

Frame2: http://www.freeimagehosting.net/uploads/09e20e5dd6.jpg

Ответы [ 3 ]

1 голос
/ 29 апреля 2010

Пример проекта Emgu "VideoSurveilance" в решении Emgu.CV.Example (Emgu.CV.Example.sln) демонстрирует отслеживание BLOB-объектов и присваивает им идентификаторы.

Я новичок в OpenCV, но мне кажется, что отслеживание только «белых» капель может оказаться сложнее, чем кажется. Например, капли на вашем образце картины на самом деле не «белые», не так ли? Я думаю, что вы действительно пытаетесь сделать это: «получить капли, которые на определенную величину ярче, чем фон», то есть найти серый шарик на черном фоне или белый шарик на сером фоне.

0 голосов
/ 29 апреля 2010

Я не могу сказать, что код будет работать, потому что я не проверял его.

Общая идея состоит в том, чтобы взять захваченный кадр (при условии, что вы захватываете кадры) и отфильтровать шум, изменив насыщенность и значение (яркость). Это модифицированное изображение HSV затем обрабатывается как оттенки серого. Блобы можно пометить, просматривая коллекцию BLOB-объектов, созданную трекером, и присваивая им идентификаторы и ограничивающие рамки.

Также вас может заинтересовать AForge.net и соответствующая статья: Распознавание жестов рук о механике и реализации использования гистограммы для компьютерного зрения.

Это модифицированная версия пользовательского кода трекера , найденная на форумах nui :

static void Main(){
    Capture capture = new Capture(); //create a camera captue
    Image<Bgr, Byte> img = capture.QuerySmallFrame();

    OptimizeBlobs(img);

    BackgroundStatisticsModel bsm = new BackgroundStatisticsModel(img, Emgu.CV.CvEnum.BG_STAT_TYPE.FGD_STAT_MODEL);
    bsm.Update(img);

    BlobSeq oldBlobs = new BlobSeq();
    BlobSeq newBlobs = new BlobSeq();

    ForgroundDetector fd = new ForgroundDetector(Emgu.CV.CvEnum.FORGROUND_DETECTOR_TYPE.FGD);
    BlobDetector bd = new BlobDetector(Emgu.CV.CvEnum.BLOB_DETECTOR_TYPE.CC);
    BlobTracker bt = new BlobTracker(Emgu.CV.CvEnum.BLOBTRACKER_TYPE.CC);

    BlobTrackerAutoParam btap = new BlobTrackerAutoParam();
    btap.BlobDetector = bd;
    btap.ForgroundDetector = fd;
    btap.BlobTracker = bt;
    btap.FGTrainFrames = 5;

    BlobTrackerAuto bta = new BlobTrackerAuto(btap);


    Application.Idle += new EventHandler(delegate(object sender, EventArgs e)
    {  //run this until application closed (close button click on image viewer)

        //******* capture image ******* 
        img = capture.QuerySmallFrame();

        OptimizeBlobs(img);

        bd.DetectNewBlob(img, bsm.Foreground, newBlobs, oldBlobs);

        List<MCvBlob> blobs = new List<MCvBlob>(bta);

        MCvFont font = new MCvFont(Emgu.CV.CvEnum.FONT.CV_FONT_HERSHEY_SIMPLEX, 1.0, 1.0);
        foreach (MCvBlob blob in blobs)
        {
           img.Draw(Rectangle.Round(blob), new Gray(255.0), 2);
           img.Draw(blob.ID.ToString(), ref font, Point.Round(blob.Center), new Gray(255.0));
        }

        Image<Gray, Byte> fg = bta.GetForgroundMask();
    });
}

public Image<Gray, Byte> OptimizeBlobs(Image<Gray, Byte img)
{
    // can improve image quality, but expensive if real-time capture
    img._EqualizeHist(); 

    // convert img to temporary HSV object
    Image<Hsv, Byte> imgHSV = img.Convert<Hsv, Byte>();

    // break down HSV
    Image<Gray, Byte>[] channels = imgHSV.Split();
    Image<Gray, Byte> imgHSV_saturation = channels[1];   // saturation channel
    Image<Gray, Byte> imgHSV_value      = channels[2];   // value channel

    //use the saturation and value channel to filter noise. [you will need to tweak these values]
    Image<Gray, Byte> saturationFilter = imgHSV_saturation.InRange(new Gray(0), new Gray(80));
    Image<Gray, Byte> valueFilter = imgHSV_value.InRange(new Gray(200), new Gray(255));

    // combine the filters to get the final image to process.
    Image<Gray, byte> imgTarget = huefilter.And(saturationFilter);

    return imgTarget;
}
0 голосов
/ 21 апреля 2010

Это зависит от вашего фона. Если он постоянно темный, как на тех изображениях, которые вы прикрепили, тогда вы сможете извлечь эти «белые» капли с некоторым порогом. Для любой более разумной сегментации вам также понадобятся некоторые другие функции (например, корреляция, если ваш объект соответствует цвету).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...