Button Presence
目的
この例の目的は、すべてのボタンが正しくボード上に配置されているかどうかをチェックすることです。
入力
異なる位置と角度で表示されるボードの画像。
出力
検出された欠落ボタン:
ヒント
ボードの位置が可変であるため、関心領域を整列させる必要があります。この場合、指定された領域のピクセル強度を分析してボタンの存在を確認することが強く推奨されます。
各ボタンに対応する円のグリッドを作成することができます。言い換えれば、このグリッドは関心領域の配列であるべきです。
接続のラベル付けについてはこちらを参照ください。
セクションの表示方法についてはこちらを学ぶことができます。
Solution (AVS)
Show Sections () ボタンをクリックしてセクションを有効にします。
Workspace Explorerでワークスペース Examples を開き、フィルムストリップウィンドウで ButtonPresence データセットを選択します。 Image チャンネルを ACQUIRE セクションにドラッグします。
ボードの位置と向きを見つけるために、ThresholdToRegion フィルターを PROCESS セクションに追加し、その入力 inMax を 115 に設定します。 PROCESS セクションには、アプリケーションの主要な機能が配置されるべきです。
RegionBoundingRectangle フィルターを追加して、ThresholdToRegion の出力領域を含む矩形を作成します。ボードは長方形なので、出力矩形 outBoundingRectangle はその境界を表します。
次に、CreateCoordinateSystemFromRectangle を使用して座標系を作成できます。これは、Rectangle2D データ型には長方形の左上隅の位置と回転に関する情報が含まれているため、非常に一般的な整列方法です。
整列が完了したら、ROI(Region of Interest)の配列を作成する準備が整いました。 INITIALIZE セクションにCreatePointGrid フィルターを追加し、次のプロパティを設定します:
- inPoint.X を 21、inPoint.Y を 16 に設定します。
- inRowCount を 6、inColumnCount を 10 に設定します。
- inRowStep と inColumnStep をどちらも 23 に設定します。これは隣接するボタンの中心間の距離です。
点の配列の代わりに、円の2D配列を取得するには、CreateCircle フィルターを INITIALIZE セクションに追加し、その入力 inPoint を outPointGrid に接続します。 inRadius を 10 に設定します。プログラムの各サイクルで円のグリッドを作成する必要はありません。最初のイテレーション中に1度だけ行うことができます。したがって、定数パラメータの値を設定するフィルターは INITIALIZE セクションに配置する必要があります。
ボタンの存在を検査するには、CheckPresence_Intensity フィルターを使用します。このフィルターを PROCESS セクションに追加し、以下の入力を接続します:
- inImage を ReadFilmstrip の出力に接続します。
- inRoi を CreateCircle の出力に接続します。
- inRoiAlignment を CreateCoordinateSystemFromRectangle の出力に接続します。
outAlignedRoi をプレビューにドラッグアンドドロップすることで、各ボタンに対応する円のグリッドを確認できます。
outContrast の値をプレビューウィンドウに配置し、プログラムを1度実行します。ボタンが存在する場合、コントラストの値は約 50 です。 存在しない場合は約 10 です。したがって、inMinContrast を 20 に設定します。 outIsPresent は検査結果の配列です。その出力を IsPresent としてラベル付けします。
実施された検査を要約するために、Empty formula フィルターを追加し、2つの出力を作成します。ラベル付けされた出力は式内で直接使用される必要はありません。
- この式では、inFileName と missing: を + で連結します。次に、欠落しているオブジェクトの数を取得するために count 関数を使用します。 inIsPresent の前の not は、False の発生を示しています。最後に、抽出された数値を toString 関数を使用して文字列に変換します。
InspectionResult = FileName + " missing: " + toString(count(not IsPresent))
- この式では、StringLabel タイプのコントラクタを使用します。最初の引数としてテキストを提供する必要があります。この場合はラベル付けされた出力 InspectionResult です。2番目の引数として、Point2D が必要です。そのため、Point2D コンストラクタを使用し、直接 X と Y 座標を指定します。
Label = StringLabel(InspectionResult, Point2D(10, 10))
すべてのイテレーションからメッセージを蓄積するには、AccumulateElements を追加し、その inElement 入力を Formula の InspectionResult 出力に接続します。
FINALIZE セクションに SaveTextLines フィルターを追加して、検査結果を含むすべてのメッセージを保存します。
- inTextLines 入力を AccumulateElements の outArray に接続します。
- 検査メッセージを保存するための InspectionResults.txt ファイルを作成します。
- inFile パラメータの値をドキュメントのパスに設定します。
Main
使用したフィルタ
アイコン | 名前 | 説明 |
---|---|---|
ThresholdToRegion | 顕著な明るさによって定義できるオブジェクトの領域の抽出。 | |
RegionBoundingRectangle_OrNil | 領域を含む最小の矩形を計算し、領域が空である場合はNILを返します。 | |
CreatePointGrid | ポイントのグリッドを作成します。 | |
DrawShapeRegions_TwoColors | 通常は、合格/不合格の状態を示すために緑または赤を使用します。 | |
CreateCircle | Creates a circle from an aligned point and radius. | |
CheckPresence_Intensity | 迅速かつ簡単な存在確認。(例: キャップ、ネジ、ラベルの紛失) | |
CreateCoordinateSystemFromRectangle | 通常、RegionBoundingRectangleなどのフィルターからオブジェクトの配置を定義するために使用されます。 | |
AccumulateElements | 多くのイテレーションで出現する要素から配列を作成します。 | |
SaveTextLines | d>テキスト行をファイルに保存します。
その他の資料
- Local Coordinate Systems - 座標系の使用に関する基本的な概念について説明しています。