Coins
目的
ビデオフレームに表示されているお金の量を数えるアルゴリズムを考案する。
入力
白い背景にコインがある単一のビデオファイル。ビデオはAVI形式で保存されています。
出力
単一のビデオフレームに表示されているお金の量。
ヒント
Aurora Vision Studioは、単一ファイルまたはビデオファイルとして保存された画像でのオフライン検査を便利に行う方法を提供します。ビデオファイルを読み込むには、ReadVideoフィルターを使用する必要があります。カメラフレームを将来のオフライン検査のために保存するには、WriteVideoフィルターを使用します。
多くの場合、画像の背景は静止しており、検査対象のオブジェクトのみが検査シーンに導入されます。画像から背景を抽出するには、SubtractImagesフィルターを使用することができます。しかし、最も有用なフィルターは、ThresholdToRegion_Relativeで、これにより領域ピクセルがそれらの間の強度の違いを分析して選択されます。
各繰り返しで背景画像を読み込むのを避けるために、最初のビデオフレームを外部のAVDATAファイルに保存する必要があります。画像は1回だけ読み込まれ、プログラム全体がファイルから読み込まれます。
コインの値を取得するには、それらの直径を分析することができます。ビデオには直径約40ピクセルのコインと約50ピクセルのコインがあります。コインの抽出後、見つかった領域を個々のコインに分割し、その後、リージョンフィーチャーの1つを使用して分類します。
より複雑な文字列を作成するために、Formulasを使用することができます。
接続のラベル付けについては こちらを参照ください。
Solution (AVS)
ReadVideoフィルターを追加し、プロジェクトに組み込み、単一のプログラムイテレーションを実行します。これをACQUIREセクションに配置します。
DelayByPeriodフィルターを同じセクションに追加します。 inTimeを25に設定して、ビデオの速度をわずかに低下させます。
最初のビデオフレームをAVDATAファイルに保存します。
- outImage出力を右クリックし、"Export to AVDATA file..."を使用します。
- 宛先ディレクトリとファイル名を選択します。
ThresholdToRegion_Relativeを追加し、ReadVideoの出力に接続します。
- inMinRelativeValueを-50に設定します。
以下の画像は、しきい値処理後の領域を示しています。
SplitRegionIntoBlobsを使用して領域を個別のブロブに分割します。コインの領域に合わないすべての領域を削除します。
- inMinBlobAreaを100に設定します。
- inMaxBlobAreaを2000に設定します。
ClassifyRegionsを追加し、分類機能をDiameterLengthに設定します。クラス分類の範囲を(40, 50)に選択します。これにより、outAccepted出力には小さいコイン(1ユーロセント)の領域が含まれます。この出力をSmallCoinsとしてラベル付けします。また、outAbove出力には大きなコインの領域が含まれます。これをBigCoinsとラベル付けします。
outAcceptedとoutAboveを拡張し、Count出力を追加します。それぞれをSmallCountとBigCountとしてラベル付けします。
空のFormulaをプログラムに追加し、以下のように設定します:
outAmountをIntegerタイプで出力し、以下の計算を行います:
Amount = SmallCount + BigCount * 5
outMessageをStringタイプで出力し、以下のメッセージを作成します:
Message = toString(Amount) + "ユーロセント"
DrawStrings_SingleColorを追加し、outMessageを入力画像に描画します。
inImageを新しいプレビューウィンドウに追加します。
マクロフィルタMainはビデオフレームからコインを抽出し、可視な金額を計算します。
使用したフィルタ
アイコン | 名前 | 説明 |
---|---|---|
![]() |
ClassifyRegions | このフィルターは、領域の配列があり、その中からさらに処理する領域を選択したい場合に使用します。 |
![]() |
DelayByPeriod | プログラムのワークフローを、フィルタの最後の呼び出し時刻からinTimeミリ秒だけ一時停止します。 |
![]() |
DrawStrings_SingleColor | 単一の色で画像に文字列(テキスト)を描画します。 |
![]() |
ReadVideo | ビデオファイルからフレームシーケンスを読み込みます。 |
![]() |
ThresholdToRegion_Relative | 各ピクセルに異なる閾値値(inBaseImage(x, y) + inValue)を使用して画像をしきい値処理します。 |
![]() |
SplitRegionIntoBlobs | オブジェクトが互いに接触していない場合に、領域を個々のオブジェクトにセグメント化します。 |