Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

エッジ検出とイメージ オーバーレイ

この例では、ビデオ ストリームにおけるオブジェクトのエッジを検出して強調表示する方法を示します。ピクセルストリームの Sobel Edge Detector ブロック、ビデオ ストリームの整列、オーバーレイの動作について、Computer Vision Toolbox™ のフルフレームのブロックで計算された同じアルゴリズムの結果と比較して検証します。

このモデル例では、ハードウェアと互換性のあるアルゴリズムを提供します。このアルゴリズムは Xilinx® Zynq® リファレンス設計を使用してボードに実装できます。を参照してください。

例の構造

EdgeDetectionAndOverlayHDL.slx のシステムを次に示します。

"Full-Frame Behavioral Model" サブシステムと "Pixel-Stream HDL Model" サブシステムに接続された線の色の違いは、モデルのストリーミングの分岐におけるイメージのレートの変化を示しています。このレート変換は、ピクセル ストリームが完全なビデオ フレームと同じ時間で送信されるように、より高いレートで送信するためのものです。

Full-Frame Behavioral Model

次のブロック線図は、フレームベースの "Edge Detection" ブロックを使用した "Full-Frame Behavioral Model" サブシステムの構造を示しています。

フレームベースの "Edge Detection" ブロックでレイテンシを導入しないとすると、イメージ オーバーレイは、ソース イメージと "Edge Detection" の出力イメージに重みを付け、それらを単純に加算することで実行されます。

次の図は、同じフレームについて、ソースのビデオ、エッジ検出の結果、重ね合わせたイメージを左から右の順に示しています。

FPGA をターゲットとする設計に進む前に、この例の "Full-Frame Behavioral Model" サブシステムのように、完全なイメージ フレームを処理するブロックを使用した動作システムを開発しておくことをお勧めします。このような動作モデルは動画処理の設計の検証に役立ちます。後で FPGA をターゲットとしたアルゴリズムの実装を検証する際に基準として使用できます。具体的には、モデルの最上位の "PSNR" (ピーク S/N 比) ブロックで、フルフレームの処理の結果をピクセルストリームの処理の結果と比較します。

Frame To Pixels: ピクセル ストリームを生成する

"Frame To Pixels" のタスクは、フル フレームのイメージをピクセル ストリームに変換することです。実際のハードウェアのビデオ システムで見られる水平方向および垂直方向の空白区間の影響をシミュレートするために、アクティブなイメージがイメージ以外のデータで拡張されます。ストリーミング ピクセル プロトコルの詳細については、Streaming Pixel Interface (Vision HDL Toolbox)を参照してください。"Frame To Pixels" ブロックは次のように構成されています。

[Number of components] フィールドは、グレースケール イメージの入力に対応する 1 に設定されています。[Video format] フィールドは、ビデオ ソースに合わせて 240p になっています。

この例では、Active Video の領域は、上流の "Corruption" ブロックからの暗いイメージの 240 行 320 列の行列に対応します。それ以外の [Total pixels per line][Total video lines][Starting active line][Ending active line][Front porch]、および [Back porch] の 6 つのパラメーターで、Active Video の 4 辺をイメージ以外のデータで拡張する量が指定されます。詳細については、Frame To Pixels (Vision HDL Toolbox)ブロックのリファレンス ページを参照してください。

"Video Source" のサンプル時間は [Total pixels per line][Total video lines] の積で決まることに注意してください。

ピクセルストリームのエッジ検出とイメージ オーバーレイ

"Pixel-Stream HDL Model" サブシステムのブロック線図を次に示します。このサブシステムから HDL コードを生成できます。

ピクセルストリームの処理の性質上、"Full-Frame Behavioral Model""Edge Detection" ブロックとは異なり、Vision HDL Toolbox™ の "Edge Detector" ブロックはレイテンシを導入します。レイテンシがある場合、そのまま 2 つのイメージに重みを付けて加算しても重ね合わせたイメージを取得できません。この問題に対処するために、"Pixel Stream Aligner" ブロックを使用して 2 つのピクセル ストリームを加算前に同期しています。

このブロックを適切に使用するには、遅延したピクセル ストリームに関連付けられているピクセルと制御バスに refPixel と refCtrl を接続する必要があります。この例では、"Edge Detector" によって導入されるレイテンシにより、"Edge Detection" サブシステムから出るピクセル ストリームが入るピクセル ストリームと比べて遅延します。したがって、refPixel と refCtrl の上流のソースは "Edge Detection" サブシステムの pixelOut と ctrlOut 信号になります。

Pixels To Frame: ピクセル ストリームを変換してフル フレームに戻す

"Frame To Pixels" が完全なイメージ フレームをピクセル ストリームに変換するのに対し、"Pixels To Frame" ブロックは同期信号を使用して逆の変換を行い、ピクセル ストリームをフル フレームに戻します。"Pixels To Frame" ブロックの出力はフル イメージの 2 次元行列であるため、5 つの同期信号を含むバスをそれ以上維持する必要はありません。

[Number of components] フィールドと [Video format] フィールドは、Frame To Pixels と Pixels To Frame の両方で、ビデオ ソースの形式に合わせてそれぞれ 1 と 240p になっています。

ピクセル ストリーム処理の設計の検証

設計のストリーミング部分の構築中は、"PSNR" ブロックにより、元のフルフレームの設計と比較して結果が継続的に検証されます。公正に比較するために、モデルの最上位の "Delay" ブロックで 2 次元行列を時間軸で揃えます。シミュレーションの過程で、"PSNR" ブロックから "inf" が出力されなければなりません。これは、"Full-Frame Behavioral Model" からの出力イメージがストリーム処理 "Pixel-Stream HDL Model" から生成されるイメージと一致することを示します。

例の検証

この例では、さまざまなしきい値やアルファ値を試して、重ね合わせたイメージの品質に対する影響を調べることができます。具体的には、モデルを開いた時点で 2 つのワークスペース変数 $thresholdValue$$alpha$ が作成されます。それぞれの初期値は 7 と 0.8 です。それらの値を MATLAB® コマンド ラインを使用して次のように変更できます。

thresholdValue=8
alpha=0.5

更新後の $thresholdValue$ は、"Full-Frame Behavioral Model" 内の "Edge Detection" ブロックと "Pixel-Stream HDL Model/Edge Detection" 内の "Edge Detector" ブロックの [しきい値] フィールドに伝播されます。$alpha$ の値は "Full-Frame Behavioral Model""Pixel-Stream HDL Model/Image Overlay""Gain1" ブロックに伝播され、$1-alpha$ の値が "Gain2" ブロックに送られます。どちらの変数も、モデルを閉じるとワークスペースから消去されます。

この例では、$thresholdValue$ の有効な範囲は 0 以上 256 以下です。$thresholdValue$ を 257 以上に設定すると、"パラメーターのオーバーフローが 'threshold' において発生しました" というメッセージがトリガーされます。この例では、$thresholdValue$ の設定を高くするほど、ビデオで検出されるエッジの量が少なくなります。

$alpha$ の有効な範囲は 0 以上 1 以下です。これは、エッジ検出の出力イメージと元のソース イメージの加算前の重みを決定します。オーバーレイ処理は次の式による線形内挿です。

   overlaid image = alpha*source image + (1-alpha)*edge image.

したがって、重ね合わせたイメージは、$alpha=0$ の場合はエッジ検出の出力になり、$alpha=1$ の場合はソース イメージになります。

HDL コードの生成と動作の検証

この例で参照している HDL コードをチェックして生成するには、HDL Coder™ のライセンスが必要です。

HDL コードを生成するには、次のコマンドを使用します。

makehdl('EdgeDetectionAndOverlayHDL/Pixel-Stream HDL Model');

テスト ベンチを生成するには、次のコマンドを使用します。

makehdltb('EdgeDetectionAndOverlayHDL/Pixel-Stream HDL Model');