アプリケーションノート: ブロブ解析#
VisualAppletsで他のオペレータと組み合わせてBlob Analysisオペレータを使用する方法を学びます。この例では、FPGA内での基本的なObject Detectionと分類のためにBlob Analysisオペレータを使用しています。ラインアプレットは、Blob Analysis 1Dオペレータの使用方法を示しています。さらに、提供された例に対応するC++ SDKプロジェクトも利用可能であり、PC側でのBlob Analysis結果の解釈を理解するのに役立ちます。(アプリケーションノート SAN011)
以下の設計例は、VisualAppletsのBlob Analysisオペレータの使用方法を示しています。
- オブジェクトビジュアライゼーション用のSDKプロジェクトを含むシンプルなBlob Analysisアプリケーション:この例では、基本的なObject DetectionにBlob Analysisを使用しています。検出されたすべてのオブジェクトがホストPCに転送されます。
- 分類およびROI選択のためのBlob Analysisの使用:この例では、FPGA内でのObject Detectionと分類のためのBlob Analysisの使用方法を示しています。
- Blob Analysis 1D:この例では、エンドレスなラインスキャン画像に対するBlob Analysis 1Dオペレータの使用方法について説明します。
オブジェクト可視化用のSDKプロジェクトを含むSimple Blob Analysisアプリケーション#
最初の例は、基本的なBlob Analysisアプレットです。カメラ画像が2値化されます。次に、2値化された画像が一方のパスでDMAに送信され、もう一方のパスではBlob Analysisが実行され、結果が2つ目のDMAチャネル経由で出力されます。
この例で使用されている2値化は、単純ななしきい値処理に基づいています。Blob Analysisは、すべての白いピクセルをオブジェクトピクセルとみなします。図2は、2つのしきい値を使用して前景の値範囲が選択されることを示しています。これにより、暗いピクセルでオブジェクトが形成されている画像や、背景に対してオブジェクトのコントラストが明るい画像を使用することができます。2値化処理自体の後、画像はバッファリングされます。バッファから画像がBlob Analysisに渡され、さらに2値化された画像を監視するためにホストPCに転送されます。
Blob Analysisパラメータの設定は、次の図のとおりです。
上の画像では、Blob Analysisデータがどのように1つのリンクにマージされるかを確認できます。この例では、特徴量が Bounding Box および Area が使用されます。まず、それぞれ16Bitsのバウンディングボックスのリンクが結合され、64 Bitsのリンク幅になります。領域も64Bitsに拡張されます。 InsertPixel オペレータを使用すると、両方のリンクが結合されます。結果として得られるDMA転送のフォーマットは次のようになります。
Simple Blob2D AppletのBlob DMAバイトオーダー#
| バイト番号 | オブジェクトフィーチャ |
|---|---|
| 0~1 | Bounding Box X0 |
| 2~3 | Bounding Box X1 |
| 4~5 | Bounding Box Y0 |
| 6~7 | Bounding Box Y1 |
| 8~15 | 面積 |
PCにおけるさまざまなバイトオーダーに注意してください。オブジェクトフィーチャのBit Widthは拡張されます。実際には、Bounding Boxは0から1023までの値を表現するために10Bitsのみを使用し、Areaは21Bitsのみを使用します。このアプレットの機能を示す小さなSDK C++プロジェクトが添付されています。デザインファイルとともに次のフォルダにあります。 Examples\Processing\BlobAnalysis\Blob2D VisualAppletsのインストールパスの
分類およびROI選択でのブロブ解析の使用#
この例では、抽出されたオブジェクトフィーチャに基づいて関心領域(ROI)を切り出すアプローチを示します。目的は、最大の面積を持つオブジェクトを見つけ、ROIを形成するために使用されるこのオブジェクトの重心を抽出することです。
この例は、Blob Analysisの結果をアプレット内で分類に使用するVisualAppletsの機能を示しており、フレームグラバー内での画像処理の可能性を大幅に向上させることができます。図1にデザインのスクリーンショットを示します。主なパーツは、2値化、Blob Analysis、分類、およびROIの切り出しです。これらのパーツについては、以下で詳しく説明します。
この例で使用されている2値化は、単純ななしきい値処理に基づいています。Blob Analysisは、すべての白いピクセルをオブジェクトピクセルとみなします。図2は、2つのしきい値を使用して前景の値範囲が選択されることを示しています。これにより、暗いピクセルでオブジェクトが形成されている画像や、背景に対してオブジェクトのコントラストが明るい画像を使用することができます。2値化処理自体の後、画像はバッファリングされます。バッファから画像がBlob Analysisに渡され、さらに2値化された画像を監視するためにホストPCに転送されます。
Blob Analysisは2値化の後に実行されます。ここでは、さらなる処理のために、x方向およびy方向の重心と面積のオブジェクトフィーチャのみが使用されます。その他のすべてのフィーチャはこの例では使用されません。
アプレットは、Blob Analysis結果の分類へと続きます(図3)。まず、重心の値が面積で割ることで正規化されます。これは単にDIVオペレータを使用して行われます。同時に、最大の面積を持つオブジェクトの検出が実行されます。ここでは、オペレータ FrameMax およびレジスタが使用されます。分類アルゴリズムのアイデアは、これまでに調査されたオブジェクトよりも面積が小さいすべてのオブジェクトを抑制することです。詳細には、Blob Analysisはオブジェクトのストリームを出力します。 FrameMax オペレータは、現在のオブジェクトがこれまでに調査されたオブジェクトよりも大きいかどうかを検出し、その出力で論理1を出力します IsMaxこの値は、レジスタの Capture 入力で使用されます。現在のオブジェクトが以前のオブジェクトよりも大きい場合、重心の座標がラッチされて出力されます。したがって、フレームの最後の出力、つまりブロブストリームは、最大の面積を持つオブジェクトの重心座標を表します。図3はこの動作を示しています。
分類モジュールは、画像内で見つかった最大のオブジェクトの重心座標を出力します。次に、座標をROI座標に変換する必要があります XOffset, XLength, YOffset および YLength図4は、この変換のデザインを示しています。 XLength および YLength は定数に設定されますが、重心座標はROIサイズの半分だけ縮小されます。
4つのROI値を使用して、DynamicROIオペレータにより元の画像からROIが切り出されます。前述のように、分類モジュールはフレームの最後の値とともに最大の面積を持つオブジェクトを出力します。これは、 DynamicROI オペレータが受信した最後のROI座標のみを考慮するため好都合です。したがって、正しい座標が使用され、元の画像から最大のオブジェクトが切り出されます。このVisualAppletsプロジェクトのデザインファイルは、次のフォルダにあります。 Examples\Processing\BlobAnalysis\Blob2D_ROI_select VisualAppletsのインストールパス内の。アプレットはmicroDisplayで実行でき、結果を直接確認できます。さらに、小さなSDKプロジェクトがこの例に追加されています。SDKプロジェクトを使用するには、ROIのDMAサイズを、モジュールによって設定されたDMAサイズに変更する必要があります ROIsizeX および ROIsizeYにアクセスできます。コンポーネントのインデックスを指定してコンポーネントにアクセスするには、 表示 microDisplayまたはの、設定 widht1 および height1 SDKプロジェクトのパラメータを使用します。
Blob Analysis 1D#
Blob Analysis 1Dのサンプルは、VisualApplets環境における1D Blobオペレータの使用方法を示しています。
1D Blob Analysisのサンプルは、ラインカメラをベースにしたシンプルなアプレットです。カメラはライン・トリガーのみで使用されます。したがって、このアプレットは実際の1D画像をベースにしています。DMA転送のために、元の画像は2D画像を形成する連続したラインの小さな断片に変換されます。アプレットのすべての部分については、以下で詳しく説明します。図1に、デザインのメインシートを示します。
取り込みには、以下に接続されたラインカメラ・オペレータが使用されます。 ImageBuffer が使用されます。このバッファにより、1D画像ラインのバッファリングが可能になります。次に、Hierarchical Boxの Binarize 内でシンプルな閾値処理が行われ、ピクセルが前景ピクセルと背景前景ピクセルに変換されます。セレクタを使用すると、元画像とバイナリ画像を画像出力パスに切り替えることができます。これを行うには、IFオペレータと CONST オペレータを使用します。 dynamic の CONST オペレータのパラメータにより、 IF オペレータの条件入力を変更して入力を切り替えることができます。したがって、実行中に元のグレースケール画像と二値化画像を切り替えることが可能です。
アプレットのアプリケーションの目的は元画像で検出されたオブジェクトの視覚化であるため、PC上の両方のDMAチャネルの同期を可能にする必要があります。ライン・マーカーを使用して、元画像の各ラインとすべてのBlobをマークします。したがって、Counterを使用して各ラインをカウントします。ライン・カウンターは、Blob AnalysisオペレータとともにHierarchical Box 1DBlobAnalysis に含まれており、ライン・カウント値は上側のリンクO000からボックスを出力します。Counterの範囲は10ビットです。したがって、値1024でオーバーフローが発生し、Counterは再びゼロから始まります。
では、 ReplaceFirstPixelByLineNo ラインの最初の4つのピクセルがライン・カウントに置き換えられます。そのために、Parallelismが変更され、32ビットの粒度で操作が実行されます。x座標はカウントであり、x座標がゼロになるたびに、元のピクセル値の代わりに(32ビットに拡張された)ライン番号が転送されます。
ライン・マーカーのほかに、Blob Analysis操作のフラッシュ条件を生成する必要があります。フラッシュはトリガー入力として実装するか、この場合は1ラインに1回フラッシュ条件を生成するように実装します。したがって、Blob Analysisはその出力を1ラインに1回ファイナライズ(Eof)します。ただし、Blob Analysisは、パラメータを使用して出力フレームが空でない場合にのみ、この動作をするように設定されます。 supres_empty_output_frames。さらに、Blob Analysisは最大オブジェクト高さが10ビット(つまり1024ピクセル)になるように設定されます。オペレータの最大出力フレームサイズは20に設定されます。より多くのオブジェクトを出力する必要があり、フラッシュ条件が発生しない場合、オペレータは新しいフレームを生成します。これらの小さな出力フレームにより、オブジェクトが検出された時刻とPCでそれを分析できる時刻の間の時間を最小限に抑えることができます。
11個のBlob Analysis出力ストリームが1つのストリームに統合され、DMAに接続されます。これを行うには、単に MergePixel および InsertPixel オペレータを使用します。オブジェクトの機能の順序を下の表に示します。
| バイト番号 | オブジェクトフィーチャ |
|---|---|
| 0 ~ 3 | Line Marker |
| 4~5 | Bounding Box X0 |
| 6~7 | Bounding Box X1 |
| 8 ~ 11 | Center of Gravity Y |
| 12 ~ 15 | Center of Gravity Y |
| 16 ~ 17 | Bounding Box Y0 |
| 18 ~ 19 | Bounding Box Y1 |
| 20 ~ 23 | 面積 |
| 24 ~ 25 | Contour Length Diagonal |
| 26 ~ 27 | Contour Length Orthogonal |
| 28 ~ 31 | Error Flags |
このプロジェクトをハードウェアで実行するには、ラインカメラとトリガー・エンコーダ・システムを備えた特殊なハードウェア・セットアップが必要です。デザインファイルは、Visual Appletsのインストールパスのフォルダ Examples\Processing\BlobAnalysis\Blob1D にあります。複雑なSDKプロジェクトがデザインに追加されており、主にオブジェクトの表示を示しています。