フレーム落ち数・フレームレート実測値の表示 (Version 3.3)
ICImagingControlのImageAvailableイベントで処理できなかったフレーム数とフレームレートの実測値を確認する方法を示しています。
Software | IC Imaging Control 3.3, Visual Studio™ 2010 |
---|---|
サンプル(C#) | DeviceCountOfFramesDropped.zip |
注意事項 | MediaSampleInfoクラスは一部のカメラのみ使用できます。 |
カメラに高速フレームレート値を設定した時、ソフトウェア上でリングバッファへのコピーが追い付かずフレーム落ちすることがあります。高速フレームを処理するアプリケーションを作成した時、お使いのPC・作成したアプリケーションによって毎秒どのくらいのフレーム数が処理できるのかが変わってくるため、フレームレート実測値とフレーム落ちした数を確認することが必要となります。
ここではImageAvailableイベントハンドラーでリングバッファにコピーしたフレーム数からフレームレートの実測値を表示する方法と、MediaSampleInfoクラス(一部の機種のみ対応可能)でカメラがカウントしたフレーム数とImageAvailable イベントハンドラーでカウントしたフレーム数の差分からフレーム落ち数のカウントをする方法を示しています。
フレームレートの実測値計算用のグローバル変数_ImageCountとフレーム落ち計算用のグローバル変数_ImageSumCountを定義する。
private int _ImageCount = 0;
private long _ImageSumCount = 0;
フレーム数をカウントするためにリングバッファへのフレームのコピーが完了する(ImageAvailableのイベントが発生する)ごとにフレーム数をインクルメントします。MediaSampleInfoクラスを使ってカメラでカウントしたフレーム数を確認することができますので(お使いのカメラによってはMediaSampleInfoが使用できないことがありますのでご了承ください)、フレーム落ちの数をImageAvailableのイベントでカウントした数から差し引くことによってカウントすることができます。
private void IcImagingControl1_ImageAvailable(object sender, ICImagingControl.ImageAvailableEventArgs e)
{
MediaSampleInfo info;
//イベント発生ごと(リングバッファへのフレームのコピーが完了する)にカウント
//グローバル変数 フレームレートの実測値計算用
_ImageCount++;
//グローバル変数 フレーム総数
_ImageSumCount++;
//カメラへのアクセス可能かどうか問い合わせ
//選択されているデバイスがMediaSampleInfo機能に対応していない場合はfalseが返されます。
if (MediaSampleInfo.TryQuery(icImagingControl1.ImageActiveBuffer, out info))
{
//カメラが取得したフレーム数
long deviceNumber = (long)info.DeviceFrameNumber;
//フレーム落ちの数=カメラが取得したフレーム数-フレーム総数
long FramesDroppedCount = deviceNumber-_ImageSumCount + 1;
if (FramesDroppedCount > 1) framesDropped = true;
else framesDropped = false;
//表示
labelText ="総フレーム:"+ _ImageSumCount
+ "デバイスフレーム番号:" + info.DeviceFrameNumber
+ ":フレーム落ち" + FramesDroppedCount
+ ":タイムスタンプ" + info.DeviceTimeStamp;
Thread t = new Thread(new ThreadStart(anotherTherad));
t.Start();
}
}
フレームレート実測値はWindowsタイマ(System.Windows.Forms.Timerクラス)を使用して、ImageAvailableイベントで計測したフレーム数をinterbal=2000msごとに計算しています。
private void FPSTimer_Tick(object sender, EventArgs e)
{
lblCurrentFrameRate.Text = String.Format("{0:0.00} Hz", (double)_ImageCount / 2.0);
_ImageCount = 0;
}
サンプルプログラムのビルドでエラーが起きた時
<現象>インターネットまたは制限付きゾーン内にあるか・・・ビルドエラーが起きた時にダウンロード、解凍したソリューションを開いてビルドすると、以下のエラーが出る。
(ファイル名)を処理できませんでした。インターネットまたは制限付きゾーン内にあるか、ファイルに Web のマークがあるためです。これらのファイルを処理するには、Web のマークを削除してください。
下記の通りエクスプローラーから該当するソースファイルのプロパティを開き、「全般」タブの一番下「セキュリティ」欄の「許可する」にチェックを入れ、「OK」を押下して閉じる。Visual Studioからソリューションを閉じて、開き直せばビルド可能です。