2016-06-28 18 views
1

Ich implementiere ein Fußgänger-Erkennungssystem mit Emgu CV-Bibliothek. Die Methode find Gibt die Anzahl der Ergebnisse zurück, die über die Methode ermittelt wurden.Wie bekomme ich die Anzahl der Ergebnisse, die durch Find-Methode in EMGU CV Fußgängererkennung C#

public static Rectangle[] findPedestrian(Image<Bgr, Byte> image) 
{ 
    Stopwatch stopwatch; 
    Rectangle[] regions; 
    if (CudaInvoke.HasCuda) 
    { 
     using (CudaHOG des = new CudaHOG(new Size(64, 128), new Size(16, 16), new Size(8, 8), new Size(8, 8))) 
     { 
      des.SetSVMDetector(des.GetDefaultPeopleDetector()); 
      stopwatch = Stopwatch.StartNew(); 
      using (GpuMat cudaBgr = new GpuMat(image)) 
      using (GpuMat cudaBgra = new GpuMat()) 
      using (VectorOfRect vr = new VectorOfRect()) 
      { 
       CudaInvoke.CvtColor(cudaBgr, cudaBgra, ColorConversion.Bgr2Bgra); 
       des.DetectMultiScale(cudaBgra, vr); 
       regions = vr.ToArray(); 
      } 
     } 
    } 
    else 
    { 
     using (HOGDescriptor des = new HOGDescriptor()) 
     { 
      des.SetSVMDetector(HOGDescriptor.GetDefaultPeopleDetector()); 
      stopwatch = Stopwatch.StartNew(); 
      MCvObjectDetection[] results = des.DetectMultiScale(image); 
      regions = new Rectangle[results.Length]; 
      for (int i = 0; i < results.Length; i++) 
       regions[i] = results[i].Rect; 
      stopwatch.Stop(); 
     } 
    } 
    //processingTime = stopwatch.ElapsedMilliseconds; 
    return regions; 
} 

Und hier erzeugt es die Rechtecke entsprechend den Ergebnissen, die durch den Prozess senden. Ich möchte die Anzahl der Ergebnisse zählen, die durch die Methode zurückgegeben werden. Ich dachte daran, es aus der Anzahl der Iterationen dieser foreach-Schleife zu bekommen.

private Image<Bgr, Byte> imagingPedestrian(Image<Bgr, Byte> image) 
{ 
    System.Drawing.Rectangle[] results = pedestrianDetection.findPedestrian(image); 
    foreach (Rectangle rect in results) 
    { 
     CvInvoke.Rectangle(image, rect, new Bgr(Color.Red).MCvScalar); 
    } 
    return image; 
} 

Kann ich einen Weg kennen, um dieses Ergebnis zu erhalten. Danke im Voraus.

+0

erhalten, wenn ich richtig verstanden habe, results.count oder results.length sollte funktionieren –

+0

Ich bin verwirrt durch den Titel und die Frage. Im Titel geht es darum zu messen, wie lange etwas dauert, aber die Frage scheint zu sein, wie oft eine Funktion aufgerufen wird. Welches ist es? – Neil

+0

Der Titel stimmt nicht mit der Frage überein. – chris579

Antwort

0

Um die verstrichene Zeit für jede Foreach-Iteration zu zählen, können Sie eine Klasse wie System.Diagnostics.Stopwatch verwenden.

Zum Beispiel:

Stopwatch sw = new Stopwatch(); 
foreach(var myVar in myCollection) 
{ 
    sw.Restart(); 

    /* 
    * your iteration code... 
    */ 

    sw.Stop(); 
    var timestampString = string.Format("{0}:{1}:{2}", sw.Elapsed.Hours.ToString("00"), sw.Elapsed.Minutes.ToString("00"), sw.Elapsed.Seconds.ToString("00")); 
    Console.WriteLine("Elapsed time: {0}", timestampString); 
} 
+0

es ist nicht klar, ob er die Ergebnisse zählen oder die Zeit messen möchte – chris579

+0

Zustimmen ... Ich nahm meine Chancen :) – Veverke

+0

Nein Ich möchte wissen, wie oft die foreach-Schleife innerhalb des gegebenen Falls iteriert hat. –

0

Wie ich die Frage verstanden Sie die Zahl der Menschen erkannt werden wollen ... wenn so können Sie es durch

results.Length