この瞬間は、画面右上に駐車しているトラックと、画面中央を左から右へ通行し ている小型車、および画面下側を右から左へ通行しているタクシーの3台の車両 が画像に表示されている。objtraqは移動物体のみを認識するため、 中央左の小型車と左下のタクシーが認識の対象となる。
objtraqを実行すると、上記の入力画像の他、認識途中のパターンを 入力画像に重ねて表示するマスク画像(図5.2) と認識結果を表示するトラッキング画像(図5.3)の 合計3枚のウィンドウが表示される。
図5.3には、移動している2台の車両が認識されてい ることがわかる。実際の表示においては、リアルタイム認識として連続的に 認識処理が行なわれた結果が示される。
{
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 に示す。画像処理のプロセスが、 ソース→フィルタ→バッファ→フィルタ→… →デスティネーション(表示)というリンクから構成されている ことがわかる。
認識処理の中心は図5.4に 示すfilter1, filter2, filter3, filter5から構成される。 ここではそれぞれのフィルタ処理の概要を説明する。
なおブロックセグメンテーションは、セグメント分割処理を行なう関数 blocksegを用意し、ライブラリが用意している汎用フィルタリング 関数MalibGenericFilterを利用することで実現している。
ブロックセグメンテーションと同様トラッキング処理を行なうフィルタも、 トラッキングを行なう関数track_objectsを用意し、 汎用フィルタリング関数MalibGenericFilterを 用いて実現する。
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のとおりである。