next up previous
Next: 開発に関する前提条件 Up: アプリケーション Previous: アプリケーション

Subsections

移動物体の認識

アプリケーションobjtraqは、グレースケールの入力動画像から移動物体 を抽出する。例題として、道路を通行する車両の認識を対象として実験を行なった。

認識処理の例

objtraqに入力する動画像のスナップショットを図 5.1に示す。
  
Figure 5.1: オリジナル画像
\includegraphics{images/originalimage.eps}

この瞬間は、画面右上に駐車しているトラックと、画面中央を左から右へ通行し ている小型車、および画面下側を右から左へ通行しているタクシーの3台の車両 が画像に表示されている。objtraqは移動物体のみを認識するため、 中央左の小型車と左下のタクシーが認識の対象となる。

objtraqを実行すると、上記の入力画像の他、認識途中のパターンを 入力画像に重ねて表示するマスク画像(図5.2) と認識結果を表示するトラッキング画像(図5.3)の 合計3枚のウィンドウが表示される。

5.3には、移動している2台の車両が認識されてい ることがわかる。実際の表示においては、リアルタイム認識として連続的に 認識処理が行なわれた結果が示される。


  
Figure 5.2: マスク画像
\includegraphics{images/maskingimage.eps}


  
Figure 5.3: トラッキング画像
\includegraphics{images/trackingimage.eps}

フィルタの構成

以下に示すコードは、objtraq.cから認識処理部を抜粋したものである。
{
  MalibSource *filter1, *filter2, *filter3, *filter4, *filter5;
  MalibBuffer *buf0,    *buf1,    *buf2,    *buf3;

  /* first buffer is ring buffer */
  buf0    = (MalibBuffer*) malib_ringbuf_new_with_source (6, src);

  {
    /* averaging filter for noise suppression */
    static int coef[3][3] = { {  1, 1, 1 }, { 1, 1, 1 }, {  1, 1, 1 } };
    filter1 = (MalibSource*) malib_spatial3x3_new_with_coef (buf0,coef);
    buf1    = (MalibBuffer*) malib_ringbuf_new_with_source (6,filter1);
  }

  {
    /* moving object extraction using frame differential */
    filter2 = (MalibSource*) malib_greydiff3_new_with_threshold (buf1, 
                  arg_threshold);
    buf2    = (MalibBuffer*) malib_plainbuf_new_with_source (filter2);
  }

  {
    /* block segmentation filter for BW image */
    filter3 = (MalibSource*) malib_genericfilter_new_with_config 
        (buf2, MALIB_FRAME_COLORMODEL_BW, NULL, blockseg);
    buf3    = (MalibBuffer*) malib_ringbuf_new_with_source (3,filter3);
  }

  {
    /* masking captured image (buf0) with extracted regions (buf4) */
    filter4 = (MalibSource*) malib_masking_new_with_bufs (buf0, buf3);
  }

  {
    /* small BW frame */
    MalibFrame* frame3 = malib_buffer_get_current_frame (buf3);
    MalibFrame* frame5 = malib_frame_new
        (MALIB_FRAME_COLORMODEL_RGB,
         frame3->width  / get_param("BLK"),
         frame3->height / get_param("BLK"),
         8, NULL);

    /* moving object tracking filter */
    filter5 = (MalibSource*) malib_genericfilter_new_with_config 
        (buf3, MALIB_FRAME_COLORMODEL_BW, frame5, track_objects);
  }

  {
    MalibGtkDisplay* darray[4];

    /* create GTK windows */
    darray[0] = malib_gtkdisplay_new_with_source (src);
    darray[1] = malib_gtkdisplay_new_with_source (filter5);
    darray[2] = malib_gtkdisplay_new_with_source (filter4);
    darray[3] = NULL;

    /* set window titles */
    gtk_window_set_title (malib_gtkdisplay_get_window (darray[0]), 
                          "original image");
    gtk_widget_set_usize (GTK_WIDGET(malib_gtkdisplay_get_window
                          (darray[1])), arg_width, 3*arg_width/4);
    gtk_window_set_title (malib_gtkdisplay_get_window (darray[1]),
                          "colored block");
    gtk_window_set_title (malib_gtkdisplay_get_window (darray[2]),
                          "masking");
    
    /* starting image processing and display results */
    malib_gtkdisplay_auto_play2 (darray);
  }
}

上記のコードで構成されるデータ構造を図5.4 に示す。画像処理のプロセスが、 ソース→フィルタ→バッファ→フィルタ→… →デスティネーション(表示)というリンクから構成されている ことがわかる。


  
Figure 5.4: 画像処理フィルタのリンク構造
\includegraphics{images/objtraqprocess.eps}

認識処理の中心は図5.4に 示すfilter1, filter2, filter3, filter5から構成される。 ここではそれぞれのフィルタ処理の概要を説明する。

filter1: 空間平滑化

各ピクセルに対してそれ自身および周囲全ての平均値をとることにより、 空間方向に対する平滑化処理を行なう。 MalibSpatial3x3フィルタを用い、 次に示す係数行列Aを各ピクセルに適用することで実現する。

\begin{displaymath}A = \left(\begin{array}{lll}
1 & 1 & 1 \\
1 & 1 & 1 \\
1 & 1 & 1 \\
\end{array}\right)
\end{displaymath}

filter2: フレーム間差分による移動物の検出

平滑化された各フレームに対し、連続2フレーム差分の論理積を計算する MalibGreyDiff3フィルタを用いて白黒二値モデルに変換する。 この処理により、連続する3フレームの間で画像の変化が大きい部分を 抽出することができる。

filter3: ブロックセグメンテーション

上記で得られた白黒二値画像に対し、ブロックセグメンテーション処理を 行なう。入力画像を複数ピクセルからなるブロックに分割し、そのブロックに 含まれるピクセルの量に応じてブロックの白/黒を判定する。すなわち白を 多く含むブロックは白、黒を多く含むブロックは黒となる。

なおブロックセグメンテーションは、セグメント分割処理を行なう関数 blocksegを用意し、ライブラリが用意している汎用フィルタリング 関数MalibGenericFilterを利用することで実現している。

filter5: 移動物体のトラッキング

セグメント分割された連続領域にラベル付けを行ない、複数フレーム間で 情報を保持することにより移動物体のトラッキングを行なう。

ブロックセグメンテーションと同様トラッキング処理を行なうフィルタも、 トラッキングを行なう関数track_objectsを用意し、 汎用フィルタリング関数MalibGenericFilterを 用いて実現する。

その他の機能

objtraqはリアルタイムに認識処理を行なう他、 MPEGファイルからの入力を対象とした認識処理、スナップショット作成の ための画像ファイル生成など付属的ないくつかの機能を備えている。 また、認識処理に関してしきい値をコマンドラインから指定できるなど、 いくつかのオプションを与えることが可能である。

objtraqのオプションは、objtraq -hあるいは objtraq -helpで表示することができる。

$ objtraq --help
Usage - objtraq [options]
  -h, --help             show this help
  -t, --threshold T      binalization threshold T [10]
  -w, --width W          frame width W [320]
  -m, --monitor          works as just a monitor
  -i, --input FILE       read from mpeg FILE as a source
  -o, --output PREFIX    write to PGM files, these filename  PREFIX
  -n, --framenum NUMBER  output frame NUMBER [60]
  -b, --blocksize SIZE   block SIZE for segmentation [8]
$

それぞれオプションの詳細は表5.1のとおりである。

 
 
Table 5.1: objtraqのオプション
オプション 意味 デフォルト
-h オプション一覧を表示する --
-t 二値化処理のしきい値を設定する 10
-w 画像の幅を指定する 320
-m 単なるモニタとして機能する --
-i MPEGファイルを入力とし、そのファイル名を指定する --
-o PGMファイルを生成する。そのプレフィクスを指定する --
-n -oオプション指定時の出力フレーム数を指定する 60
-b セグメンテーションのブロックサイズを指定する 8


next up previous
Next: 開発に関する前提条件 Up: アプリケーション Previous: アプリケーション
Jun IIO
2001-06-14