Chocolate Cookies Inspection 3D
目的
この例のタスクは、クッキーをセグメント化し、カウントして、その寸法を測定することです。
入力
3Dスキャナーで取得したクッキーの表面。

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

ヒント
Surfaceデータタイプの点群を取得したら、それを画像に変換するフィルターを見つけてみましょう。その後、領域分析技術を使用してセグメント化を実行できます。クッキーを表すブロブを抽出した後、MeasureObjectWidth3Dを使用してそれらをカウントし、寸法を測定することができます。
Solution (AVS)
- Workspace ExplorerでExamplesワークスペースを開き、フィルムストリップウィンドウでChocolateCookieデータセットを選択します。SurfaceチャンネルをACQUIREセクションにドラッグします。 
- CropSurfaceを追加します。出力のoutSurfaceをinSurfaceに接続します。フィルターをクリックし、左下のプロパティウィンドウでinZLimits.MinとinZLimits.Maxをそれぞれ12および23に設定します。inPreserveDimensionsをTrueに設定します。これにより、背景やノイズに対応するポイントが削除されます。 
- CreateImageFromSurface_AnyScalesフィルターを追加して、指定された表面のz値の画像を作成します。これにより、入力データが3Dであっても2Dツールを使用できます。outSurfaceをinSurfaceに接続します。フィルターをクリックし、プロパティウィンドウでinPixelOffsetを0に設定します。 
- 次に、「SegmentAndCountCookies」などの名前を付けた新しいステップマクロフィルターを作成します。outImageとoutSurfaceをマクロフィルターの入力に接続します。マクロフィルター内にExtractBlobs_Intensityを追加します。 
- マクロフィルターの入力inImageをinImageに接続します。フィルターをクリックし、プロパティウィンドウで以下の値を設定します: - inThresholdParams.PolarityをBrightに設定し、背景より明るいブロブを抽出します。
- inThresholdParams.Thresholdを1に設定して、小さなノイズを除去します。
- inSplittingParams.MinAreaを200000に設定し、それ以上の面積のブロブのみを考慮します。
- inSplittingParams.MaxAreaを900000に設定し、それ以下の面積のブロブのみを考慮します。
 
- 次に、ClassifyRegionsフィルターを追加します。outBlobsをinRegionsに接続します。フィルターをクリックし、プロパティウィンドウで次のパラメータを設定します: 
- RegionUnion_OfArrayを追加します。outAcceptedをinArrayに接続します。 
- CropSurfaceToRegionフィルターを追加し、Surfaceをボックスに対応するポイントなしでクッキーのみを表すようにします。マクロフィルターのinSurface入力をinSurfaceに接続し、outRegionをinRegionに接続します。フィルターをクリックし、プロパティウィンドウでinPreserveDimensionsをTrueに設定します。 
- 空のFormulaを追加し、次の操作を行います: - クッキーの期待枚数を表す新しいマクロフィルター入力を追加します(例:「inExpectedNumberOfCookies」Integerタイプ)。デフォルト値を12に設定し、新しく作成した式に接続します。
- outAccepted出力を右クリックし、プロパティ出力を選択してCountプロパティを選びます。それをinNumberOfCookies入力として式に接続します。
- 次のように新しい出力を式に作成します: - outIsCountOK = inExpectedNumberOfCookies == inNumberOfCookies 
- outIsCountOK出力をマクロフィルターの出力に接続します。 
 
- Mainに戻り、別のステップマクロフィルター(例:「FindSurfaceMinimalPoint」)を作成します。SegmentAndCountCookiesマクロフィルターからのoutSurfaceを新しく作成したマクロフィルターの入力として接続します。 
- SegmentAndCountCookiesマクロフィルターからのoutBlobsを配列接続として接続します。これにより、マクロフィルターが配列モードで実行されます(詳しくは、Aurora Vision Studioの配列をご参照ください)。 
- マクロフィルターの中でFillRegionHolesを追加し、領域内の以前の穴にあったピクセルも含むように領域を拡張します。inRegion入力をinRegionに接続します。 
- 次にErodeRegionを追加し、領域を薄くしてクッキーの高さを後で見つけるのに適した最小点を見つけます。このステップは、クッキーのエッジが丸くなっているために重要です。前のフィルターからのoutRegionを現在のフィルターのinRegionに接続します。inRadiusXを30に設定してエッジのノイズを除去します。 
- 次に、表面内の領域の最小点を取得するためにSurfaceMinimalPointフィルターを追加し、inSurfaceをinSurfaceに接続し、前のステップで得られた領域のoutRegionをinRoiに接続します。outMinimalPoint出力をマクロフィルターの出力にドラッグします。 
- Mainに戻ります。次に、各クッキーに対して個別のローカル座標系を作成する新しいステップマクロフィルター(例:「CreateLocalCoordinateSystem3D」)を作成します。SegmentAndCountCookiesマクロフィルターからのoutSurfaceとoutBlobsを新しい入力として接続します:それぞれinSurfaceFormatとinRegion(配列接続として)。このマクロフィルターも配列モードで実行されます。 
- マクロフィルターの中でRegionBoundingBox_OrNilを追加します。inRegionをinRegionに接続します。 
- 次にCreateCoordinateSystemFromRectangleフィルターを追加して、さらなる解析のためのアライメントを作成します。outBoundingRectangleをinRectangleに接続します。 
- 次にConvertCoordinateSystem2DTo3Dを追加して、画像の座標系を3D座標系に変換します。表面フォーマットが指定されていない限り、これらは整合しない可能性があります。outCoordinateSystemをinCoordinateSystemに接続します。次に、inSurfaceFormatをinSurfaceFormatに接続します。 
- outCoordinateSystem出力をマクロフィルターの出力にドラッグします。 
- Mainに戻ります。別のステップマクロフィルター(例:「MeasureObjectDimensions」)を作成します。SegmentAndCountCookiesマクロフィルターからのoutSurfaceと前のマクロフィルターからのoutCoordinateSystemを現在のものの入力としてそれぞれinSurfaceとinScanFieldAlignmentとして接続します。 
- マクロフィルター内でMeasureObjectWidth3Dフィルターを2つ追加し、inSurfaceとinScanFieldAlignmentをinSurfaceとinScanFieldAlignmentに両方のフィルターで接続します。 
- 次に最初のフィルターをクリックし、プロパティウィンドウで次の変更を行います: - inScanFieldをクリックし、クッキーの高さを計算するためのスキャンパスをマークします。
- inScanCountを10に設定し、スキャンの回数を増や します。
- inScanWidthを10に設定し、スキャンフィールドの幅を増やします。
- inStripeScanParams.StripePolarityをValidに設定し、クッキーを表す表面の実際のポイントのみを検出します。
- inMaxProfileGapWidthを10に設定し、許容されるプロファイルギャップの最大値とします。
 
- 次に他のMeasureObjectWidth3Dフィルターをクリックし、プロパティウィンドウで次の変更を行います: - inScanFieldをクリックし、クッキーの幅を計算するためのスキャンパスをマークします。
- inScanCountを10に設定し、スキャンの回数を増やします。
- inScanWidthを10に設定し、スキャンフィールドの幅を増やします。
- inStripeScanParams.StripePolarityをValidに設定し、クッキーを表す表面の実際のポイントのみを検出します。
- inMaxProfileGapWidthを400に設定し、許容されるプロファイルギャップの最大値とします。
- inOutlierSuppressionをTukeyに設定し、このケースで誤って検出されたポイントを無視する最適な方法とします。
 
- 両方のoutObjectWidth出力をマクロフィルター出力として、それぞれoutVerticalDimensionとoutHorizontalDimensionに接続します。 
- 次の入力を持つ空のFormulaを追加します: - デフォルト値7のinMinVerticalDimension
- デフォルト値39のinMinHorizontalValue
- デフォルト値17のinMinHeight
 
- 
式内で以下の出力を作成します: 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.

