2010-04-17 5 views
0

Je veux créer un programme en utilisant C# avec Emgu qui peut détecter les gouttes blanches sur les images de la caméra et aussi le suivre. En outre, le programme peut récupérer les ID des blobs chenillésComment faire un suivi blob blanc pour la capture vidéo ou caméra sur Emgu?

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

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

+3

Ce n'est pas une tâche triviale, et vous devriez réduire votre question à un problème plus spécifique que vous avez avec la mise en œuvre de ce. – Danvil

Répondre

0

Cela dépend quel est votre fond comme. S'il est constamment sombre comme sur les images que vous avez jointes, vous devriez être capable d'extraire ces blobs "blancs" avec un certain seuil. Pour toute segmentation plus intelligente, vous devrez également utiliser d'autres fonctions (par exemple, une corrélation similaire si votre objet est cohérent avec les couleurs).

0

Le projet exemple Emgu "VideoSurveilance" de la solution Emgu.CV.Example (Emgu.CV.Example.sln) illustre le suivi des tâches blob et leur attribue des ID. Je suis un novice à OpenCV mais il me semble que le suivi des blobs "blancs" seulement peut être plus difficile que ça en al'air. Par exemple, les blobs dans votre image d'échantillon ne sont pas vraiment "blancs" sont-ils? Ce que je pense que vous essayez vraiment de faire, c'est "obtenir les blobs qui sont plus brillants que l'arrière-plan d'une certaine quantité", c'est-à-dire trouver une tache grise sur un fond noir ou une tache blanche sur un fond gris.

0

Je ne peux pas dire que le code fonctionnera parce que je ne l'ai pas testé.

L'idée générale est de prendre la trame capturée (en supposant que vous capturez des images) et filtrer le bruit en modifiant la saturation et la valeur (luminosité). Cette image HSV modifiée est ensuite traitée en niveaux de gris. Les blobs peuvent être étiquetés en faisant une boucle sur la collection de blob générée par le tracker et les identifiants et les bounds box assignés.

En outre, vous pouvez être intéressé par AForge.net et l'article connexe: Hands Gesture Recognition sur la mécanique et la mise en œuvre de l'utilisation de l'histogramme pour la vision par ordinateur.

Ceci est une version modifiée du code suivi personnalisé found on the nui forums:

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; 
} 
Questions connexes