Chocolate Cookies Inspection 3D

目的

この例のタスクは、クッキーをセグメント化し、カウントして、その寸法を測定することです。

入力

3Dスキャナーで取得したクッキーの表面。

出力

セグメント化されたクッキーの画像、クッキーの数、寸法、完全性の確認。

ヒント

Surfaceデータタイプの点群を取得したら、それを画像に変換するフィルターを見つけてみましょう。その後、領域分析技術を使用してセグメント化を実行できます。クッキーを表すブロブを抽出した後、MeasureObjectWidth3Dを使用してそれらをカウントし、寸法を測定することができます。

Solution (AVS)

  1. Workspace ExplorerExamplesワークスペースを開き、フィルムストリップウィンドウでChocolateCookieデータセットを選択します。SurfaceチャンネルをACQUIREセクションにドラッグします。

  2. CropSurfaceを追加します。出力のoutSurfaceinSurfaceに接続します。フィルターをクリックし、左下のプロパティウィンドウでinZLimits.MininZLimits.Maxをそれぞれ12および23に設定します。inPreserveDimensionsTrueに設定します。これにより、背景やノイズに対応するポイントが削除されます。

  3. CreateImageFromSurface_AnyScalesフィルターを追加して、指定された表面のz値の画像を作成します。これにより、入力データが3Dであっても2Dツールを使用できます。outSurfaceinSurfaceに接続します。フィルターをクリックし、プロパティウィンドウでinPixelOffset0に設定します。

  4. 次に、「SegmentAndCountCookies」などの名前を付けた新しいステップマクロフィルターを作成します。outImageoutSurfaceをマクロフィルターの入力に接続します。マクロフィルター内にExtractBlobs_Intensityを追加します。

  5. マクロフィルターの入力inImageinImageに接続します。フィルターをクリックし、プロパティウィンドウで以下の値を設定します:

  6. 次に、ClassifyRegionsフィルターを追加します。outBlobsinRegionsに接続します。フィルターをクリックし、プロパティウィンドウで次のパラメータを設定します:

    • inFeatureRectangularityに設定し、長方形の形状のブロブを検出します。
    • inMinimum0.8に設定し、誤ったブロブが受け入れられないようにします。
  7. RegionUnion_OfArrayを追加します。outAcceptedinArrayに接続します。

  8. CropSurfaceToRegionフィルターを追加し、Surfaceをボックスに対応するポイントなしでクッキーのみを表すようにします。マクロフィルターのinSurface入力をinSurfaceに接続し、outRegioninRegionに接続します。フィルターをクリックし、プロパティウィンドウでinPreserveDimensionsTrueに設定します。

  9. 空のFormulaを追加し、次の操作を行います:

    • クッキーの期待枚数を表す新しいマクロフィルター入力を追加します(例:「inExpectedNumberOfCookies」Integerタイプ)。デフォルト値を12に設定し、新しく作成した式に接続します。
    • outAccepted出力を右クリックし、プロパティ出力を選択してCountプロパティを選びます。それをinNumberOfCookies入力として式に接続します。
    • 次のように新しい出力を式に作成します:

      outIsCountOK = inExpectedNumberOfCookies == inNumberOfCookies

    • outIsCountOK出力をマクロフィルターの出力に接続します。

  10. Mainに戻り、別のステップマクロフィルター(例:「FindSurfaceMinimalPoint」)を作成します。SegmentAndCountCookiesマクロフィルターからのoutSurfaceを新しく作成したマクロフィルターの入力として接続します。

  11. SegmentAndCountCookiesマクロフィルターからのoutBlobsを配列接続として接続します。これにより、マクロフィルターが配列モードで実行されます(詳しくは、Aurora Vision Studioの配列をご参照ください)。

  12. マクロフィルターの中でFillRegionHolesを追加し、領域内の以前の穴にあったピクセルも含むように領域を拡張します。inRegion入力をinRegionに接続します。

  13. 次にErodeRegionを追加し、領域を薄くしてクッキーの高さを後で見つけるのに適した最小点を見つけます。このステップは、クッキーのエッジが丸くなっているために重要です。前のフィルターからのoutRegionを現在のフィルターのinRegionに接続します。inRadiusX30に設定してエッジのノイズを除去します。

  14. 次に、表面内の領域の最小点を取得するためにSurfaceMinimalPointフィルターを追加し、inSurfaceinSurfaceに接続し、前のステップで得られた領域のoutRegioninRoiに接続します。outMinimalPoint出力をマクロフィルターの出力にドラッグします。

  15. Mainに戻ります。次に、各クッキーに対して個別のローカル座標系を作成する新しいステップマクロフィルター(例:「CreateLocalCoordinateSystem3D」)を作成します。SegmentAndCountCookiesマクロフィルターからのoutSurfaceoutBlobsを新しい入力として接続します:それぞれinSurfaceFormatinRegion(配列接続として)。このマクロフィルターも配列モードで実行されます。

  16. マクロフィルターの中でRegionBoundingBox_OrNilを追加します。inRegioninRegionに接続します。

  17. 次にCreateCoordinateSystemFromRectangleフィルターを追加して、さらなる解析のためのアライメントを作成します。outBoundingRectangleinRectangleに接続します。

  18. 次にConvertCoordinateSystem2DTo3Dを追加して、画像の座標系を3D座標系に変換します。表面フォーマットが指定されていない限り、これらは整合しない可能性があります。outCoordinateSysteminCoordinateSystemに接続します。次に、inSurfaceFormatinSurfaceFormatに接続します。

  19. outCoordinateSystem出力をマクロフィルターの出力にドラッグします。

  20. Mainに戻ります。別のステップマクロフィルター(例:「MeasureObjectDimensions」)を作成します。SegmentAndCountCookiesマクロフィルターからのoutSurfaceと前のマクロフィルターからのoutCoordinateSystemを現在のものの入力としてそれぞれinSurfaceinScanFieldAlignmentとして接続します。

  21. マクロフィルター内でMeasureObjectWidth3Dフィルターを2つ追加し、inSurfaceinScanFieldAlignmentinSurfaceinScanFieldAlignmentに両方のフィルターで接続します。

  22. 次に最初のフィルターをクリックし、プロパティウィンドウで次の変更を行います:

    • inScanFieldをクリックし、クッキーの高さを計算するためのスキャンパスをマークします。
    • inScanCount10に設定し、スキャンの回数を増や します。
    • inScanWidth10に設定し、スキャンフィールドの幅を増やします。
    • inStripeScanParams.StripePolarityValidに設定し、クッキーを表す表面の実際のポイントのみを検出します。
    • inMaxProfileGapWidth10に設定し、許容されるプロファイルギャップの最大値とします。
  23. 次に他のMeasureObjectWidth3Dフィルターをクリックし、プロパティウィンドウで次の変更を行います:

    • inScanFieldをクリックし、クッキーの幅を計算するためのスキャンパスをマークします。
    • inScanCount10に設定し、スキャンの回数を増やします。
    • inScanWidth10に設定し、スキャンフィールドの幅を増やします。
    • inStripeScanParams.StripePolarityValidに設定し、クッキーを表す表面の実際のポイントのみを検出します。
    • inMaxProfileGapWidth400に設定し、許容されるプロファイルギャップの最大値とします。
    • inOutlierSuppressionTukeyに設定し、このケースで誤って検出されたポイントを無視する最適な方法とします。
  24. 両方のoutObjectWidth出力をマクロフィルター出力として、それぞれoutVerticalDimensionoutHorizontalDimensionに接続します。

  25. 次の入力を持つ空のFormulaを追加します:

    • デフォルト値7inMinVerticalDimension
    • デフォルト値39inMinHorizontalValue
    • デフォルト値17inMinHeight
  26. 式内で以下の出力を作成します:

    IsVerticalDimensionOK = VerticalDimension > inMinVerticalDimension

    IsHorizontalDimensionOK = HorizontalDimension > inMinHorizontalDimension

    IsHeightOK = SurfaceMinimalPoint > inMinHeight

    InspectionResult = IsVerticalDimensionOK and IsHorizontalDimensionOK and IsHeightOK

マクロフィルタ メイン

マクロフィルタ CreateLocalCoordinateSystem3D

マクロフィルタ FindSurfaceMinimalPoint

マクロフィルタ MeasureObjectDimensions

マクロフィルタ SegmentAndCountCookies

使用したフィルタ

アイコン 名前 説明
RegionUnion_OfArray 入力領域のいずれかに含まれるすべてのピクセルを含む領域を計算します。
ClassifyRegions このフィルターは、領域の配列があり、その中からさらに処理する領域を選択したい場合に使用します。
ErodeRegion 領域を細くする、または小さな部分を除去します。
RegionBoundingRectangle_OrNil 領域を含む最小の矩形を計算し、領域が空である場合はNILを返します。
ExtractBlobs_Intensity 単一の値を使用して閾値処理を行い、画像をブロブにセグメント化します。
SurfaceMinimalPoint 最小のZ座標を持つ表面の点を見つけます。
ConvertCoordinateSystem2DTo3D 表面画像に接続された座標系を表面に接続された座標系に変換します。
FillRegionHoles 入力領域にピクセルを追加し、穴がないようにします。
CreateImageFromSurface_AnyScales 3Dデータ上で2D操作を実行できるようにします。
MeasureObjectWidth3D ストライプ検出を使用してオブジェクトの幅を測定します。
CropSurface 与えられた長方形の箱に含まれない表面の点を除去します。
CreateCoordinateSystemFromRectangle 通常、RegionBoundingRectangleなどのフィルターからオブジェクトの配置を定義するために使用されます。
CropSurfaceToRegion 与えられた領域に存在しない点を除去します。

その他の資料

  • ブロブ解析 - ブロブ分析手法について詳しく説明します。
  • 数式 - 数式の使用に関する詳細情報です。
  • Geometry 3D - List of filters useful in 3D geometry.
  • Surface - Filters performing operations on surfaces in Aurora Vision Studio.