/* * ***************************************************************** * * * * * Copyright (c) Fast Corporation, 1997 * * * * * * All Rights Reserved. Unpublished rights reserved under * * * the copyright laws of the Japan. * * * * * * The software contained on this media is proprietary to * * * and embodies the confidential technology of Fast * * * Corporation. Possession, use, duplication or * * * dissemination of the software and media is authorized only * * * pursuant to a valid written license from Fast Corporation. * * * * * ***************************************************************** */ /* CSC90X フィルタリング filter.c */ /*[作成者]Y.Hori */ /* 目的:フィルタリングを行なう 関数:濃淡画像ライブラリの、8画像強調・フィルタリングライブラリ 履歴:Ver 1.0 99/07/27 注記:m_menu.hをインクルードして下さい。 m_menu.c及びm_note.cをリンクして下さい。 */ /************************************************************** ** Include compiler runtime library ** **************************************************************/ #include #include /************************************************************** ** Include CSC90X library ** **************************************************************/ #include "f_stdlib.h" #include "f_time.h" #include "f_gui.h" #include "f_stdio.h" #include "f_graph.h" #include "f_image.h" #include "f_pinf.h" #include "f_video.h" #include "f_system.h" #include "f_filter.h" /************************************************************** ** Include CSC90X common local ** **************************************************************/ #include "m_menu.h" /************************************************************** ** プロトタイプ宣言 ** **************************************************************/ void main ( void ); void main_menu_disp ( void ); void disp_help ( void ); extern int message_note ( void ); static void fnExec( int ); static int fnLap_gau( int, int ); /************************************************************** ** define ** **************************************************************/ #define LANG_N 2 #define MAIN_MENU_N 4 #define INIT_CUR_POS_X 255 #define INIT_CUR_POS_Y 239 #define SIZE 15 #define SIGMA 1.8 /************************************************************** ** メニュー項目 ** **************************************************************/ static const char *str_main_menu[MAIN_MENU_N][LANG_N] = { { " EXEC ", "  実行 " } }; /************************************************************** ** メイン関数 ** **************************************************************/ void main( void ) { int sts; int xpos; int ypos; int s_xpos; int s_ypos; PRIVATE WORD wXs, wYs, wXe, wYe; int wGray_mem; /* 初期メッセージ表示 */ if( NORMAL_RETURN != message_note( ) ) return; /* パラメタ初期化 */ xpos = INIT_CUR_POS_X; ypos = INIT_CUR_POS_Y; s_xpos = INIT_CUR_POS_X; s_ypos = INIT_CUR_POS_Y; /* 入力ビデオ制御 */ Lib_input_video_control( GRAY_PLANE ); /* ビデオ出力表示項目制御 */ Lib_display_control( GRAY_PLANE | LINE_PLANE | CHAR_PLANE ); /* ビデオ表示項目クリア */ Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); /* カーソル初期化 */ Lib_init_cursor(); Lib_get_stage_window( &wXs, &wYs, &wXe, &wYe ); /* メインメニューの表示 */ main_menu_disp(); /* マウスカーソルの表示 */ Lib_draw_cursor( INIT_CUR_POS_X, INIT_CUR_POS_Y ); if( ERROR_RETURN != ( wGray_mem = Lib_alloc_gray_memory( )) ) { /* メニュー制御 */ for (;;) { sts = 0; /* マウス位置読みとり */ sts = Lib_see_current_position( &xpos, &ypos ); if ( s_xpos != xpos || s_ypos != ypos ) { /* マウス表示位置移動 */ Lib_move_cursor( xpos, ypos ); s_xpos = xpos; s_ypos = ypos; } /* 処理振り分け */ if( CURSOR_EXECUTE == sts ) { if ( xpos > MENU_1_XS && xpos < MENU_1_XE && ypos > MENU_1_YS && ypos < MENU_1_YE ) { Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); fnExec( wGray_mem ); Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); main_menu_disp( ); } else if ( xpos > MENU_H_XS && xpos < MENU_H_XE && ypos > MENU_H_YS && ypos < MENU_H_YE ) { Lib_memory_clear( LINE_PLANE | CHAR_PLANE ); disp_help( ); /* ヘルプ */ main_menu_disp( ); } else if ( xpos > MENU_E_XS && xpos < MENU_E_XE && ypos > MENU_E_YS && ypos < MENU_E_YE ) { break; /* 終了 */ } } } Lib_free_gray_memory( wGray_mem ); } else Lib_display_message( 100, 150, "エラー", "メモリが確保できませんでした" ); Lib_set_stage_window( wXs, wYs, wXe, wYe ); } /************************************************************** ** メインメニュー表示   ** **************************************************************/ static void main_menu_disp( void ) { int iLanguage; /* 日本語/英語表示文字列切替情報取得 */ iLanguage = Lib_get_disp_language(); /* 整列キー表示 -> ( m_menu.c ) */ SUB_menu_disp4he( (char *)str_main_menu[0][iLanguage], (char *)NULL, (char *)NULL, (char *)NULL ); } /************************************************************** ** ヘルプ表示   ** **************************************************************/ static void disp_help( void ) { Lib_chrdisp( 10, 8, "【機能\概要】 FILTER" ); Lib_chrdisp( 11, 9, "このプログラムは、濃淡画像ライブラリにある、すべての" ); Lib_chrdisp( 11, 10, "フィルタをかけることができます。" ); Lib_chrdisp( 10, 12, "【実行について】" ); Lib_chrdisp( 11, 13, "フィルタは「メディアンフィルタ」の後「Sobelフィルタ」" ); Lib_chrdisp( 11, 14, "といった風に、連続してかけることができます。freezeボ" ); Lib_chrdisp( 11, 15, "タンを押すと、新たに画像を取り込みます。" ); } /************************************************************** ** 実行   ** **************************************************************/ static void fnExec( wGray_mem1 ) int wGray_mem1; { int wGray_mem0; int wPad_level; int wWidth, wHeight; int wX_pos, wY_pos; int wNo, wRtn; int wTemp; int wClock_count; int wTime; char str[64]; wGray_mem0 = Lib_get_gray_memory( ); Lib_freeze( TRANSMIT ); /* キーサイズの設定 */ Lib_set_pad_maxstring( 16 ); /* メニューサイズの取得 */ Lib_get_standard_key_size( &wWidth, &wHeight ); /* パッドのオープン */ wPad_level = Lib_view_open( ); /* パッドのタイトル */ Lib_view_set_title( wPad_level, "Filter" ); /* メニューの登録 */ Lib_view_set_null( wPad_level, 5, 5, "freeze", 0 ); Lib_view_set_null( wPad_level, 5, 8+wHeight, "近傍平均", 1 ); Lib_view_set_null( wPad_level, 8+wWidth, 8+wHeight, "ラプラシアン", 2 ); Lib_view_set_null( wPad_level, 5, 11+wHeight*2, "近傍最大値", 3 ); Lib_view_set_null( wPad_level, 8+wWidth, 11+wHeight*2, "近傍最小値", 4 ); Lib_view_set_null( wPad_level, 5, 14+wHeight*3, "4近傍最大値", 5 ); Lib_view_set_null( wPad_level, 8+wWidth, 14+wHeight*3, "4近傍最小値", 6 ); Lib_view_set_null( wPad_level, 5, 17+wHeight*4, "メディアン", 7 ); Lib_view_set_null( wPad_level, 8+wWidth, 17+wHeight*4, "Roberts", 8 ); Lib_view_set_null( wPad_level, 5, 20+wHeight*5, "Sobel", 9 ); Lib_view_set_null( wPad_level, 8+wWidth, 20+wHeight*5, "1次微分", 10 ); Lib_view_set_null( wPad_level, 5, 23+wHeight*6, "2次微分", 11 ); Lib_view_set_null( wPad_level, 8+wWidth, 23+wHeight*6, "鮮鋭化", 12 ); Lib_view_set_null( wPad_level, 5, 26+wHeight*7, "ラプラシアン ガウシアン", 13 ); Lib_view_set_null( wPad_level, 8+wWidth, 26+wHeight*7, "ゼロクロッシング", 14 ); /* パッドの表示位置取得 */ Lib_get_start_pad( wPad_level, &wX_pos, &wY_pos ); /* パッドの表示位置とサイズ設定 */ Lib_view_set_size( wPad_level, wX_pos, wY_pos, 5, 5 ); /* パッドの表示 */ Lib_draw_command( wPad_level ); for( ; ; ) { if(ERROR_RETURN != ( wNo = Lib_process_command( wPad_level )) ) { Lib_erase_command( wPad_level ); Lib_strtclk_count( ); if( 0 == wNo ) { if( wGray_mem0 != Lib_get_gray_memory( ) ) { wTemp = wGray_mem0; wGray_mem0 = wGray_mem1; wGray_mem1 = wTemp; } Lib_freeze( TRANSMIT ); } else { Lib_gray_memory_cls( wGray_mem1 ); if( 1 == wNo ) wRtn = Lib_averaging( wGray_mem0, wGray_mem1 ); /* 近傍平均 */ else if( 2 == wNo ) wRtn = Lib_laplacian( wGray_mem0, wGray_mem1 ); /* ラプラシアンフィルタ */ else if( 3 == wNo ) wRtn = Lib_max_filter( wGray_mem0, wGray_mem1 ); /* 近傍最大値 */ else if( 4 == wNo ) wRtn = Lib_min_filter( wGray_mem0, wGray_mem1 ); /* 近傍最小値 */ else if( 5 == wNo ) wRtn = Lib_max4_filter( wGray_mem0, wGray_mem1, 0 ); /* 4近傍最大値 */ else if( 6 == wNo ) wRtn = Lib_min4_filter( wGray_mem0, wGray_mem1, 0 ); /* 4近傍最小値 */ else if( 7 == wNo ) wRtn = Lib_median( wGray_mem0, wGray_mem1 ); /* メディアンフィルタ */ else if( 8 == wNo ) wRtn = Lib_roberts( wGray_mem0, wGray_mem1 ); /* Roberts オペレータ */ else if( 9 == wNo ) wRtn = Lib_sobel( wGray_mem0, wGray_mem1, XY_DIRECTION ); /* Sobel オペレータ */ else if( 10 == wNo ) wRtn = Lib_fdefferential( wGray_mem0, wGray_mem1, XY_DIRECTION ); /* 1次微分オペレータ */ else if( 11 == wNo ) wRtn = Lib_sdefferential( wGray_mem0, wGray_mem1 ); /* 2次微分オペレータ */ else if( 12 == wNo ) wRtn = Lib_sharp( wGray_mem0, wGray_mem1 ); /* 鮮鋭化 */ else if( 13 == wNo ) wRtn = fnLap_gau( wGray_mem0, wGray_mem1 ); /* ラプラシアン ガウシアン */ else if( 14 == wNo ) wRtn = Lib_zero_cross( wGray_mem0, wGray_mem1, 8, 255 ); /* ゼロクロッシング */ else if( 102 == wNo ) break; if( NORMAL_RETURN == wRtn ) { wTemp = wGray_mem0; wGray_mem0 = wGray_mem1; wGray_mem1 = wTemp; Lib_xvideo_transmit( wGray_mem0, GRAY_PLANE ); } else { Lib_display_message( 100, 150, "エラー", "フィルタリングに失敗しました" ); break; } } wClock_count = Lib_readclk_count( ); wTime = ( wClock_count * 8138 ) / 10000; Lib_sprintf( str, "Time = %d(msec)", wTime ); Lib_chrdisp( 40, 30, str ); Lib_stopclk_count( ); Lib_display_keyinput( 0, 0, "確認" ); Lib_chrdisp( 40, 30, " " ); Lib_draw_command( wPad_level ); } } Lib_erase_command( wPad_level ); /* コマンドパッドを消す */ Lib_view_close( wPad_level ); /* パッドのクローズ */ Lib_set_pad_maxstring( 10 ); Lib_freerun( ); } /************************************************************** ** ラプラシアン ガウシアン   ** **************************************************************/ static int fnLap_gau( wGray_mem0, wGray_mem1 ) int wGray_mem0; int wGray_mem1; { int *wpOp; int wMult; int wRtn_code = 0; if( 0 != ( wpOp = (int *)Lib_mlalloc( SIZE * SIZE * sizeof( int ) )) ) { if( NORMAL_RETURN == Lib_get_convolver( SIZE, SIGMA, wpOp, &wMult )) { if( ERROR_RETURN == Lib_lg_filter( wGray_mem0, wGray_mem1, wpOp, wMult, SIZE )) { Lib_display_message( 100, 150, "エラー", "フィルタリングに失敗しました" ); wRtn_code = -1; } } else { Lib_display_message( 100, 150, "エラー", "コンボルバー作成に失敗しました" ); wRtn_code = -1; } Lib_lfree( (char * )wpOp ); } else { Lib_display_message( 100, 150, "エラー", "メモリが確保できません" ); wRtn_code = -1; } return( wRtn_code ); }