2016-07-03 8 views
-1

以下のメソッドは、findPedestrian()メソッドで識別されたオブジェクトの四角形を処理します。 'rectCount'変数を割り当てて、各フレームごとに矩形の数を表示します。そして、 'maxCount'変数は、処理中にカウントされる四角形の最大数を示します。整数変数を設定して秒数以内にリセットする方法

private Image<Bgr, Byte> imagingPedestrian(Image<Bgr, Byte> image) 
    { 
     System.Drawing.Rectangle[] results = pedestrianDetection.findPedestrian(image); 
     //System.Drawing.Rectangle[] results2 = vehicleDetection.findVehicle(image); 
     foreach (Rectangle rect in results) 
     { 
      CvInvoke.Rectangle(image, rect, new Bgr(Color.Red).MCvScalar); 
      rectCount = results.Count(); 
      label1.Text = rectCount.ToString(); 
      if(rectCount > maxCount1) 
      { 
       maxCount1 = rectCount; 
       label8.Text = maxCount1.ToString(); 
      } 
      else 
      { 
       label8.Text = maxCount1.ToString(); 
      } 
     } 
     return image; 
    } 

この質問では、10秒ごとに矩形のカウントを取得します。 10秒後、maxCount変数がリセットされます。その後、次の10秒以内に最大矩形数が表示されます。賢明なように、それは10秒ごとに反復して実行する必要があります。 ...事前に

おかげでそれを実装するためにとにかくは、フォームにtimerを追加します。..

+0

_ "それを実装するにはとにかくありますか?" - もちろん、そうです。それはプログラミングです。あなたが達成したいことを正確に述べることができれば、それを行うことができます。何を試しましたか?あなたの質問はあまりにも広すぎます。あなたが試したことを示す良い[mcve]と、具体的に何が問題になっているのかについての正確で詳細な説明を提供してください。 'Stopwatch'を使って、経過時間や.NETのいくつかの' Timer'クラスの1つを追跡し、定期的にコードを実行することができます。 –

+0

私は、後続の最大値(すなわち、過去10秒間の最大値)の計算は、10秒ごとに最大値をリセットするよりも有用である/共通であることを指摘する。 –

+0

@PeterDuniho ok私はそれに値を割り当てた整数変数を持っているとしましょう。 10秒後にどうすれば0にリセットできますか? –

答えて

0

あります。ツールボックスからフォームにドラッグすることができます。また、ドキュメントに示されているように、フォームに宣言することもできます。 Intervalプロパティを10000(ミリ秒で10秒)に設定し、Enabledをtrueに設定するか、Start()メソッドを呼び出すことができます。

次に、Tickイベントのハンドラを追加します。このイベントは、間隔が経過するたびに発生します。そのハンドラー内で更新を実行することができます。

+0

あなたは正しいです。私のリンクは壊れていましたが、私はWindowsフォームタイマを参照していました。 –

0

私が正しく理解している場合は、System.Timerクラスを使用する必要があります。 MSDNから

例:

using System; 
using System.Timers; 

public class Example 
{ 
    private static System.Timers.Timer aTimer; 

    public static void Main() 
    { 
     SetTimer(); 

     Console.WriteLine("\nPress the Enter key to exit the application...\n"); 
     Console.WriteLine("The application started at {0:HH:mm:ss.fff}", DateTime.Now); 
     Console.ReadLine(); 
     aTimer.Stop(); 
     aTimer.Dispose(); 

     Console.WriteLine("Terminating the application..."); 
    } 

    private static void SetTimer() 
    { 
     // Create a timer with a two second interval. 
     aTimer = new System.Timers.Timer(2000); 
     // Hook up the Elapsed event for the timer. 
     aTimer.Elapsed += OnTimedEvent; 
     aTimer.AutoReset = true; 
     aTimer.Enabled = true; 
    } 

    private static void OnTimedEvent(Object source, ElapsedEventArgs e) 
    { 
     Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}", 
          e.SignalTime); 
    } 
} 

// The example displays output like the following: 
//  Press the Enter key to exit the application... 
// 
//  The application started at 09:40:29.068 
//  The Elapsed event was raised at 09:40:31.084 
//  The Elapsed event was raised at 09:40:33.100 
//  The Elapsed event was raised at 09:40:35.100 
//  The Elapsed event was raised at 09:40:37.116 
//  The Elapsed event was raised at 09:40:39.116 
//  The Elapsed event was raised at 09:40:41.117 
//  The Elapsed event was raised at 09:40:43.132 
//  The Elapsed event was raised at 09:40:45.133 
//  The Elapsed event was raised at 09:40:47.148 
// 
//  Terminating the application... 

あなたが見ることができるように、あなたはタイマーを作成するには、必要な値を達成したときに、それは毎回リセットされますので、trueに自動リセットを設定し、また、そのイベントのたびにあなたの方法をサブスクライブタイマーが通過すると、必要なコードが実行されます。

アプリケーションに同じアプローチを適用するだけで、問題を解決する必要があります。

+1

私の答えは最初に、UIスレッドでTickイベントが発生しないと言っていましたが、私は間違っていました(修正しました)。しかし、System.Timer.Timersクラスを使用すると、 Elapsed'イベントは別のスレッドで発生します。したがって、その場合は、UIの更新がUIスレッドで行われていることを確認する必要があります。 –

+0

@ScottHannen説明を追加していただきありがとうございます! –

関連する問題