Cap (Advanced)

目的

この例のタスクは、シール (キャップの下のプラスチック リング) が正しく配置されているかどうかを確認することです。

Input

ボトルの上部のイメージです。 ボトルの位置は可変です。

Output

検査結果を画像上に出力します。 欠陥が検出された場合、その周囲に四角形が描画されます。

ヒント

オブジェクトの位置は、垂直軸と水平軸の両方に沿って変化します。 1D エッジ検出技術を使用すると、オブジェクトの方向、移動、スケールに関係なく動作するように他のツールを構成するために使用できるローカル座標系を作成できます。

接続のラベル付けについては、こちらで説明されています。

Solution (AVS)

  1. Workspace Explorer例題を開き、フィルムストリップウィンドウでCapDifficultデータセットを選択します。画像チャンネルを「ACQUIRE」セクションにドラッグします。

  2. ScanSingleStripeフィルターを追加して、X 軸に沿ったキャップの位置を検出します。
    • inScanPath 入力の「...」ボタンをクリックして、スキャンのパスを描画するための GUI を開きます。キャップの垂直方向のほぼ中央でキャップと交差する水平パスを描きます。パスは画像の幅と同じ長さである必要があります。「OK」をクリックして GUI を閉じます。
    • フィルター パラメーターで、MinStripeWidthの値をキャップの予想される直径よりわずかに小さく設定します (ここでは300で十分です)。StripePolarityパラメータがDarkに設定されていることを確認してください。
    • フィルターの下部にあるをクリックし、 outStripeサブメニューの[Width][Point1]、および[Point2]オプションをチェックします。これにより、検出されたストライプの幅と両方のエッジ ポイントを確認できるようになります。
    • outStripe.Point1LeftPointという名前を付けます。
  3. CreateCoordinateSystemFromPointフィルターを追加し、前のフィルターのoutStripe.Point1をこのフィルターのinPointに接続します。
    • フィルターのプロパティで、inScaleの横にある目のアイコンをクリックします。これで、このパラメータの入力ポートが表示されます。前のフィルターのoutStripe.Widthパラメーターをそれに接続します。
    • inScaleDivisorフィールドに360と入力します。これは、プログラムの次のステップの基準となる基準キャップの直径です。キャップの位置は画像に垂直な軸に沿って変化することにも注意してください。ただし、この方法で座標系を作成すると、スケールが確実にキャップの幅に合わせて調整されます。つまり、キャップをカメラに近づけるとスケールが大きくなります。
    • outCoordinateSystem.ScaleScaleというラベルを付けます。
  4. プログラムを 1 回実行してから、ScanSingleEdgeフィルターを追加します。前のフィルターからのoutCoordinateSystem出力をinScanPathAlignment入力に接続します。
    • inScanPathの「...」ボタンをクリックします。GUI で、座標系がinScanPathAlignmentに設定されていることを確認します。キャップの最高点でおおよそ交差する垂直スキャン パスを描きます。「OK」をクリックしてエディタを閉じます。
    • [Show/Hide Ports]をクリックしてoutCoordinateSystem.Scale出力を表示し、 outEdgeサブメニューの[Point]オプションをチェックします。
    • outEdge.PointTopPointというラベルを付けます。
  5. outAlignment2出力を使用してFormulaを作成します。データを数式に手動で接続する代わりに、ラベル付き出力を使用できることに注意してください。:

    outAlignment2 = CoordinateSystem2D(Point2D(LeftPoint.X, TopPoint.Y), 0.0, Scale )

    • CoownedSystem2D データ型のコンストラクターを使用して、Formula 内に座標系を作成します。
    • コンストラクターには、原点(Point2D)、角度 (Real)、およびスケール(Real)の3つの入力が必要です。
    • スケールは Scaleラベルの値と同じです。
    • 角度は0に等しくなります。
    • 原点は、x座標LeftPointx座標に等しく、y座標TopPointy座標に等しい点と等しくなります。
  6. [プロジェクト エクスプローラー] セクションで、[Create New Global Parameter...]をクリックします。変数の名前を選択し、タイプをSegment2DArrayに設定します。
    • 「初期値」の下にあるプラスアイコンをクリックします。次に、「新しい項目の追加」をクリックし、新しく作成された項目の「...」アイコンをクリックします。これにより、セグメントエディタが開きます。
    • エディターで、まずReadFilmstripから画像を参照画像として選択します。次に、座標系フィールドを以前に作成した数式の出力に設定し、最後にキャップと交差する垂直セグメントを幅の約 4 分の 1 で描画します。「OK」をクリックします。
    • ここで、それぞれSegment2Dである 2 つの新しい項目を追加します。1 つは中央に、もう 1 つは幅の 4 分の 3 にあります。
    • 「OK」をクリックしてグローバルパラメータの作成を終了します。
  7. プログラムを 1 回実行してから、別のScanSingleEdgeフィルターを追加します。
    • プロジェクト エクスプローラー セクションからドラッグして、以前に作成したグローバル パラメーターをinScanPath入力に接続します。
    • 式の出力をinScanPathAlignment入力に接続します。
    • フィルター名の後に「[3]」という接尾辞が付いていることに注意してください。これは、プログラムの 1 回の反復でフィルターが 3 回実行されることを示します。つまり、配列のセグメント (グローバル パラメーター) ごとに 1 回ずつ実行されます。
    • フィルターのプロパティでEdgeTransitionDarkToBrightに変更します。また、MinMagnitude5から4に下げます。
    • 「Show/Hide Ports」をクリックしてoutEdge.IsNil出力を表示し、outEdgeサブメニューの「Point」オプションをチェックします。これにより、エッジが検出されたかどうかがわかります。出力にDefectPresentというラベルを付けます。
  8. 別の数式フィルターを追加します。 outIsOK出力を作成します。この出力は画像に示されます。ボトルは隙間が検出されない場合にのみ通過します。

    outIsOK = all(DefectPresent) ?? False

    また、outResultText入力条件が True の場合はテキストが「PASS」、入力が False の場合は「FAIL」と表示されます。

    outResultText = outIsOK? "PASS" : "FAIL"

  9. DrawStrings_MultiColorフィルタを追加します。

    • outResultTextinStringsに、 outIsOKinColorIdsに接続します。
    • フィルタのプロパティでinLocationsの横にある「...」ボタンをクリックしてエディタを開きます。
    • 画像のほぼ中央上部に 1 つの点を配置します。
    • 他のプロパティを変更して、テキストの色とサイズを変更できます。ここでは、inSize24に設定されています。
  10. CreateBoxフィルタを追加します。
  11. DrawRectangles_SingleColorフィルタを追加します。[プロパティ] ウィンドウで、四角形の外観を変更できます。
  12. DrawStrings_MultiColorからプログラム内の最後の3つのフィルターを選択します。
    • それらを右クリックし、「ExtractStep...」オプションを選択します。
    • これでマクロフィルターの名前を変更できるようになりました (ここではDrawResults)。
    • このフィルタの入力と出力を右クリックして編集をクリックすると、ポートの名前とタイプを変更できます。
  13. 新しく作成したフィルターを入力し、outImageをマクロフィルター出力バーにドラッグします。
  14. 作成したフィルターの出力をプレビューにドラッグします。
  15. これで、プログラム全体の最終出力は、検査結果ラベルと長方形でマークされた欠陥を含む画像になるはずです。

マクロフィルタ メイン

マクロフィルタ DrawResults

使用したフィルタ

アイコン 名前 説明
ScanSingleStripe 対向するエッジのペアによって定義されるオブジェクトを非常に高速に検出または測定します。
CreateBox ボックスを作成します。
ScanSingleEdge 物体 (ボトルの水平方向の変位など) と簡単な測定 (ボトル内の液面など) を非常に高速に検出します。
DrawStrings_MultiColor 画像上に複数の色で文字列(テキスト)を描画します。
CreateCoordinateSystemFromPoint 1D エッジ検出またはブロブ分析の結果からオブジェクトの位置合わせを定義するために最もよく使用されます。
DrawRectangles_SingleColor 画像上に単色で四角形を描画します。

その他の資料

  • 1D Edge Detection - エッジ検出フィルターがどのように機能するかを説明しています。
  • Local Coordinate Systems - 座標系の使用に関する基本的な概念について説明しています。
  • 数式 - 数式の使用に関する詳細情報です。