---Ver.2.1(00/10/13)--- ep.c: 関数を整理しました。削除した関数については、remove.txtに記述し てあります。また、関数の説明を書いたファイルを作成しました。 function.txt、行った修正、これから行うかも知れない修正については、 ftodo.txtに記述してあります。 eph.c: ハードウェアに依存しない関数をep.cに移しました。 thwindow.c: EPH_SetBrightness,EPH_SetContrast関数の仕様変更にともない、記 述を変更しました。 ---Ver.2.01(00/09/19)--- da.c: DA_OutFault()の内部での記述がおかしく、正常に動作していなかっ たバグを修正しました。 DA_OutX(160,0); DA_OutY(160,0); を DA_OutX(0,RANGE0/2); DA_OutY(0,RANGE0/2); に修正しました。 dacprog/interface.da.c: DA_OutFault()の内部での記述がおかしく、正常に動作していなかっ たバグを修正しました(上記)。 dacprog/contec.pci.da.c: 新たに作成しました。PCI Busに接続するDACに対応しました。 DIOがついていないので、Windowの出力は、CH3に、電圧で 出力するようにしました。 Window 0 -10Volt Window 1 -5 Volt Window 2 +5 Volt Window 3 +10Volt Window外 0 Volt dacprog/getadr.c: PCIバスに接続したDACカードのアドレスが正常に取得できるかを 検査するプログラムです。 dacprog/memo.pci: PCIバスに接続するDACカードに関する解説です。 本体のプログラムに変更はありません。 ---Ver.2.0(2000/08/09)--- autocal.c: 反射点位置を表示するようにしました。 表示順番等を変更しました。 cal_or.c: 反射点に対応するように関数を拡張しました。 一部関数の名前を変更、拡張しました。 (OR_RestoreOriginRadiusをOR_RestoreParametersに変更。) Calc parameters実行後の画面描画表示において、瞳孔中心を通り短 軸を延長した直線と同時に表示する瞳孔中心点を補正後の位置に表示 するようにしました。 cencalib.c: 反射点に対応するように拡張しました。 datawindow.c: 反射点に対応するように拡張しました。 Option->UseReflection->On View->Center positionの場合、 ピンク色の線->反射点重心x座標 薄い緑色の線->反射点重心y座標 View->Camera coordinatesの場合、 ピンク色の線->眼球回転中心x座標 薄い緑色の線->眼球回転中心y座標 を表示するようにしました。 eph.c: Video for Linuxの場合、60Hz時に、奇数フィールドの描画を抑制す ることによりCPUの負担を軽減。見た目には変化はありません。 初期化部分で、EP_SetRegionを実行しないよう変更しました。 ROIを1pixel単位で設定できるように変更しました。 EPH_Read関数の戻値に256を追加、それに伴い、ep.cの一部を変更しました。 ep.c: ROIを1pixel単位で設定できるように変更しました。 (回りに黒い部分ができ て、Robust Modeでエラーが出やすくなる場合は、適切にROIを設定することに より回避できます。) 日本語のメッセージを英語に変更しました。 それぞれの変換方式用の関数を新設しました。 int EP_ObjVecRC(double xr,double yr,double MAT[],struct vector *V); int EP_ObjVecPR(struct o_para P,double xr,double yr,double MAT[],struct vector *V); 反射点を含めて平らな部分の平均値を求めるルーチンを作成しました。 int EP_GetCenterMode6(double *x,double *y,double *a, double *l,double *xr,double *yr,int mode); void EP_ResetRefOffset(void); void EP_ResetRefOffsetPR(void); void EP_ResetRefRatio(void); void EP_ResetPRLength(void); int EP_SetRefOffset(double a,double b); int EP_SetRefOffsetPR(double a,double b); int EP_SetRefRatio(double r); int EP_SetPRLength(double l); void EP_SetRefThreshold(int th); int EP_GetRefThreshold(void); を作成しました。 不正な値をセットした場合は、値はリセットされ、初期値に戻るよう にしました。 EP_GetRefRatioの失敗したときの戻値を0にしました。 反射点の閾値をプログラムから変更できるように修正しました。 EP_GetCenterMode,EP_GetCenterMode4,EP_GetCenterMode6 の成功戻値を1、失敗戻値を0に変更。 xynum=0のときの処理を追加し、異常終了しないように修正しました。 WriteArray関数内に、EPH_ReadXP()の戻値が255以上だったときは、255 を戻すようにしました。 fileio.c: eph.cにて、EP_SetResgionを行っていたため、ROIの設定が次回に反 映されなかったバグを修正しました。 RefRatio,RefOffset,RefOffsetPR,CalcMethod,matrixRC,matrixPR,RefThreshold を保存、読み込みできるように設定しました。 info.c: parameterを表示するためのウィンドウを作りました。 i_rec.c: EPH_IsDispImage()を使い、60Hz時に表示を抑制し処理落ちがなくな るようにしました。 Camera coordinateの際、左ボタンダブルクリックを使用できなくしました。 method menuを追加しました。 Pupil-RotationCenter 従来の瞳孔中心と、眼球回転中心を用いて視線方向を計算します。 Reflection-RotationCenter 反射点と眼球回転中心を用いて視線方向を計算します(反射点の位置 を求めるために瞳孔中心位置を使用しています)。 Pupil-Reflection 瞳孔中心座標と反射点を用いて視線方向を計算します。カメラに瞳孔 中心と角膜上の反射点が写る範囲で頭部が動いても計測できます。 View->Object coordinatesの場合、 Pupil-RotationCenter、Reflection-RotationCenterの際に簡易補正 ができます。Pupil-Reflectionの場合は、頭部が動いても計測値に影 響がないため、簡易補正は必要ないので機能しません。 補正したい場所で、マウス左ボタンをダブルクリックします。 info Windowの設定を追加しました。 matrix.c: 反射点に対応するように拡張しました。 ウィンドウの出現位置をきめました。 メッセージの一部を変更しました。 objcalib.c: 反射点に対応するように拡張しました。 Window Managerのクローズボックスが働かないバグを修正しました。 DC_GetData関数の戻値に対応し、 データ採取できない場合は、ウィ ンドウをpopしないように修正しました。 setting.c: 常時Hires Onの設定にしました。それに伴いHiresの設定を削除しました。 反射点を利用するか、しないかの設定を追加しました。。 デフォルトでは、反射点を利用しません。 showwindow.c: Option->UseReflection->On 反射点位置を十字で表すようにしました。 Command->Calc Parametersでパラメータ設定後は、瞳孔中心位置と眼 球回転中心位置より計算で求めた反射点位置をX印で表示するように しました。 十字とX印の中心があっていれば、うまく計算できていることになり ます。一致していない場合は頭部とカメラの相対位置が動いたことを 表します。 thwindow.c 反射点の閾値を設定するスクロールバー作成しました。 反射点の閾値、+、-ボタンを作成作成しました。 反射点を赤い色で表すようにしました。 ---Ver.1.1(2000/07/14)--- autocal.c: Command->Calc parameterを選択し、パラメータを設定すると、datawindowが Camera coordinatesに自動的に切り替わる様に変更しました。 datawindowにて、視標を全部設定後自動的に、Command->Calc paramterが呼び 出された際に、Matrixが存在していない場合のみ、Command->Calc Matrixを自 動的に起動するように変更しました。 da.c: 瞳孔検出失敗時における出力関数、DA_OutFault()を作成しました。現時点で は、0 voltを出力するように設定しています。コメントとして、-5 voltの場 合を追加しました。プログラム終了時に出力が、0 voltになるように変更しま した(daprog/interface.da.cにも同様の変更をしています)。 datawindow.c: 選択におけるマウスボタンの1、2の役割を入れ替えました。Camera coordinates の表示の際に、Object coordinatesと表示されていたバグを修正 しました。 DAコンバータ使用時において、瞳孔が検出できない場合は、DA_OutFault()を 実行するよう変更しました(cf. da.c)。 eph.c: 入力チャンネルをプログラムから選択できるように変更しました。 EPH_GetMaxChannel,EPH_GetSrcChannel,EPH_SetSrcChannel関数を作成しまし た。 fileio.c: Calc parameter および Calc matrixによって、計算されたパラメータを保存 するかどうかを設定できるようにしました。初期状態では、保存しないになっ ています。ビデオ入力チャンネルを保存するよう変更しました(cf. eph.c)。. i_recrc が無い場合のデフォルトの入力チャンネルは、このファイルのstatic int Channel=2の値です。 i_rec.c: バージョンを表示するようにhelp表示を一部変更しました。 Command->Reset Paramが、Camera coordinates,Object coordinates の際に使用できないにも関わらず、選択可能な表示になっていたバグ を修正しました。 外部のファイルから、datawindowの表示モードを変更するための関数 IR_ViewChange()を作成しました。 Command->Reset Paramにおいて、Matrixも初期化するように変更しました。 視標を位置を校正する際、従来はCommand->Pauseした後、マウス1ボタンで範 囲を指定する、もしくは、適切な場所をマウス2ボタンでだぶるクリックする ようになっていました。しかし、マウスボタン1、2の使用頻度を考え、ボタ ンの役割を入れ替えました。また、今回は、マウスボタン1ダブルクリックに 限り、Command->Pauseを行わなくても、ダブルクリックするだけで、Pause を 行い、領域を選択するように変更しました。 視標の数だけ、校正値が入力されると、自動的にCommand->Calc paramterが起 動するようにしました。Matrixが設定されていない場合は、その後、 Command->Calc Matrixも自動的に起動されるようにしました (cf. autocal.c,objcalib.c)。 Pauseしているときに、datawindow領域においてマウス3ボタンを押すと、 Pauseが解除されるようにしました。Command->Startと異なり、datawindow は、 クリアされません。 入力チャンネルを設定するように変更しました(cf. eph.c)。 matrix.c: IR_ViewChange()を使用できるように設定しました。 Matrixが計算されたときの表示の順番を誤差情報が先頭に来る様に変更しまし た。 Matrixが設定された場合は、datawindowの表示をobject coordinates に自動 的に切り替わるようにしました。 objcalib.c: 視標の数だけ、校正値が入力されると、自動的にCommand->Calc paramterが起 動するようにしました。Matrixが設定されていない場合は、その後、 Command->Calc Matrixも自動的に起動されます(cf. autocal.c, i_rec.c)。 setting.c: Calc parameter および Calc matrixによって、計算されたパラメー タを保存するかどうかを設定するための項目を作成しました。 thwindow.c: ビデオ入力チャンネルを選択できるようにしました。 ---ver.1.0(00/07/01)--- eph.c:( Video for Linux) #defineの変更により入力チャンネルの設定をできるようにしました。 matrix.c: 表示のバグを修正しました。 fileio.c: matrixを設定していなくても、matrixを書き出してしまうバグを修正。 datawindow.c: DC_SetMatrix()を修正し、初期化と前回のマトリックスの読み込みを 区別するようにしました。 3ヶ月ほど、放置していましたが特にバグ報告もないようなので、今回の修正 を持って、ver1.0の完成とします。 ---ver0.42(00/03/28)--- pwin.c: pwin.h: datawindowの描画モードが、center positionになっている際に有効です。 Windowメニューより、Pos Windowを選択し、コントロール用のWindowを表示し ます。マウス操作によって、瞳孔画像上にWindowを設置することができます。 また、コントロール用Windowのボタン操作、数値入力によっても変更できます。 D(Display)トグルスイッチを黒く(ON)にすることにより、Windowが有効になり ます。Windowは、全部で4個表示することが可能です。瞳孔中心がWindowに入 ると、Window の色が白から緑に代ります。ContecのDAコンバータを使用する 設定になっていると、DAコンバータ付属のDIOに番号に対応するチャンネルの 出力が変化します。このDAコンバータのDIOのチャンネル数が4チャンネルなの でWindowの数が4個となっています。プログラムの大掛かりな変更なく、数を 増やすことが可能です。 da.c: da.h: DIO出力ルーチンを付加しました。Window毎に出力するチャンネルが異なるた め、Windowが重なって設置されている場合、重なっている部分に瞳孔中心がく ると、両方の出力が出ることになります。 cencalib.c: cencalib.o: datawindowの描画モードがobject coordinateになっている際に有効です。 datawindowで領域を選び、それに相当する視標の番号(omapにある)を選ぶこ とにより、簡易補正をすることができます。 fileio.c: fileio.h: pwinの情報を保存するようにしました。回転中心、回転半径、変換行列を保存 するようにしました。キャリブレーションを再度行わなくても、前回のデータ を利用することができます。位置のずれは、簡易補正によって修正します。 i_rec.c: i_rec.h: pwin用にメニューを追加しました。 pwin用にマウスのアクションを追加しました。 cencalib用にマウスのアクションを追加しました。 datawindow.c: datawindow.h: showwindow.c: showwindow.h: pwin用に記述を追加しました。 <おまけ> dacprog/interface.da.c: インターフェース社のDAコンバータIBX-3303 用のプログラムです。 da.cと差し換えて使用することができます。ただし、このボードは、 DIOが2チャンネルしかないため、 Window に入力なし ...00 Window0に入力あり ...01 Window1に入力あり ...10 Window2に入力あり ...11 Window3に入力あり ...11 のように出力します。重なりは認識されず、番号の若い Windowの番号が表示されることになります。 これで、i_rec for PC98 Version 2.00相当かな? ---ver0.41(00/02/24)--- omap.c: omap.h: 対象物座標を記述できるようにしました。対象物座標に関する説明は、pc98版 における、omapに関する記述を参照してください。 objectlib.c: objectlib.h: 対象座標系を設定するための記述を変更しました。校正するための対象座標点 の数を自動的に合わせます。storeを押すと、その値を凝視点を見ているとき の、瞳孔中心座標として設定し、次の凝視点の設定に移ります。store+を押す と、設定をしますが、次の凝視点の設定には移りません。凝視点のデータを追 加したい場合に押します。cancelを押すと設定しません。 matrix.c: matrix.h: 対象物への変換行列を計算します。 1)calc parametersによって、回転中心、回転半径を設定。 2)pause->datawindowをマウスで選択により、凝視点を見ているときの 瞳孔中心座標を3点以上設定。 1),2)が設定されていないと、行列の計算はできません。また、計算されても 計算値に異常がある場合は、実行されても計算結果のWindowが出ません。計算 が正常に実行されると、ウィンドウが表示されます。 ウィンドウには、 1)変換行列 2)変換行列によって変換されたのx,y,z方向の単位ベクトルのノルム。 理想では、1。 3)変換行列によって変換されたのx,y,z方向の単位ベクトルの相互の内積。 理想では、90度 4)凝視点を見ているときの瞳孔中心座標から求めた対象物座標系における 角度と対象物の角度のx,y方向の差、両者を合わせた差 理想では、0。 が、表示されます。 これらの値を見て、変換行列を設定する場合は、setボタンを押します。再度 設定する場合は、cancelを押して、校正するための瞳孔中心座標を再度設定し ます。 2),3)の値が、理想値よりも離れていても、4)の値が1度以下なら、setして大 丈夫でしょう。この辺りのずれについては、PC98版 i_recマニュアルにて多少 触れています。 i_rec.c: matrix計算をするためのメニューを動作するようにしました。 対象物座標系へviewを変更するメニューを動作するようにしました。 datawindow.c: datawindow.h: 対象物座標系への対応等を行いました。 showwindow.c: showwindow.h: 瞳孔中心の軌跡をon/offできるようにしました。 setting.c: setting.h: 瞳孔軌跡on/offのボタン類(YellowDot on/off)を作成しました。 精度を落としても、瞳孔中心を計算し続けるモード(Robust)on/offのボタン類 を作成しました。 ep.c: ep.h: ep.cを変更し、精度を落として瞳孔中心を計算し続けるモード(Robust)を作成 しました。これは、HiresOnの時に計算できない場合、計算を断念せずに、 EP_SearchRegionの結果を使用するモードです。Hireso on/offの中間に位置す るものとなります。Hireso off時には、動作に影響を及ぼしません。 連立方程式を解く部分のエラー対策をしました(pibot_n関数のエラー処理を 強化)。 fileio.c: object mapを保存するようにしました。 YellowDotModeを保存するようにしました。 RobustModeを保存するようにしました。 i_rec for PC98 version1.00相当になりました。 ---ver0.40(00/02/15)--- omap.c を作成しました。object座標系に変換するための校正用位置座標入力 用です。未完成です。 i_rec.cより、二つのポップアップシェル(カメラ座標系への校正確認ポップ アップシェル、object座標系への校正確認用ポップアップシェル)部分を、別 ファイルに切り出しました。それぞれ、autocal.c autocal.h objcalib.c objcalib.hです。 i_rec.cに新たなメニューを二つ追加しました。両方とも、object座標系への 校正に用いるものです。まだ、メニューを実行することはできません。 従来は、ポップアップシェルをウィンドマネージャーから、閉じようとすると (ウィンドウに付属しているクローズボタンをクリックする等の動作)プログ ラムが終了してしまいましたが、ポップアップシェルが閉じるように変更しま した。cancelボタンがあるものについては、そのボタンを押したのと同等の動 作をします。また、メインのウィンドに関しては、quitと同等の動作になりま す。thwindow.c setting.cを変更しました。 setting.cを変更し、ratioの入力欄において、return、ctrl-m、linefeed、 ctrl-j を無効にしました。 ctrl-qで、プログラムが終了します(だいぶ前から実装していましたが、記述 していませんでした)。ctrl-pでプログラムが一時停止します(今回実装しま した)。一時停止を解除するにも、ctrl-pを用います。 note版、acvc版、v4l版の違いは、da.c da.h eph.c eph.h Imakefile.* です。 ---ver0.39(00/02/07)--- Video for Linuxに対応しました。 i_rec.c datawindow.cを、Video for Linuxに対応するために修正を行ないました。 eph.c eph.h for V4Lを作成しました。 eph.c eph.h for sccを修正しました。 eph.c eph.h for acvcを修正しました。 scc,acvcに関しては、若干の高速化を計りました。 Video for Linuxに関しては、-DHiFrqフラグを立てて、コンパイルすることにより、 疑似的に60Hzでのサンプルが可能になります。 NTSC信号においては、1/60sec毎に、偶数、奇数フィールドが、描画され、そ れを合成することにより一つのフレームが出来上がります。V4Lは、ビデオ信 号をフレーム毎にキャプチャーします。 i_recは、最初に偶数フィールドを計算し、結果を出力します。その後、奇数 フィールドを計算、出力します。偶数フィールドの計算値出力から、奇数フィー ルドの計算値出力までの時間は計算速度に依存します。現実には、この間隔は、 1/60secであるはずなのですが、現時点のインプリメントでは、不定となります。 計算速度が十分早ければ、1/30sec間に2回出力があることになります。これ を以って、疑似60Hzと名乗っています。 また、画像入力から計算出力まで、最低でも(計算時間が0の場合でも) 1/60secの遅れが生じます。おそらくは、20ms以上の遅れがあるんじゃないか と思います(V4Lを用いても、30Hzなら、遅れ時間は従来と同じ)。 60Hzで、画面出力を行なうというのは、計算機に結構な負荷を掛けることにな ります。ネットワーク越しの表示は、60Hzでは、処理落ちが起こります。計算 機も十分に早い必要があります。また、ヒストグラム表示を行なうと、ローカ ルに表示している場合でも、処理落ちが起こります。 ---ver0.38(00/01/26)--- Hires offにしたとき、グラフの表示が乱れるのバグをフィックス。 ---ver0.37(00/01/19)--- i_rec.cを変更し、右上に起動時より時間経過を表示するようにしました。 thwindow.cを整理しました。 i_rec.cからthwindow.c関連を整理しました。 thwindow.cを変更し、brightness,contrast,thresholdにスライドバーを付け ました。また、threshold調節を自動にした際、閾値を数値、スライドバーで 即時表示するようにしました。 setting.cを変更し、Hiresスイッチを付けました。オンにしておくと、従来通 りです。このスイッチをオフにすると、楕円近似の前段階処理で結果を出力し ます。精度が落ちますが、瞳孔が流れてしまっている場合でも結果を表示しま す(してしまいます)。 fileio.cを変更し、Hiresスイッチの結果を保存するようにしました。 ---ver0.36(00/01/05)--- Viewプルダウンメニューを選択すると、segmentation faultしてしまうバグを 修正しました。 修正箇所は、i_rec.cの以下の部分です。 649c649 < XtNforeground,gray, --- > XtNforeground,gray.pixel, 659c659 < XtNforeground,gray, --- > XtNforeground,gray.pixel, grayをgray.pixelに変更しました。 それ以外の修正はありません。 Linuxでのコンパイル、動作確認を行ないました。 ---ver0.35(99/12/29)--- setting.c setting.hを作成しました。 キャプチャーする画面の縦横比の補正値ratioを自動/手動で設定できるよう にしました。 縦横方向のエッジを使って瞳孔を計算する/横方向のみのエッジを使って計算 するを切替えられるようにしました。 新しく設定した値を、保存、読み込みをできるようにしました。 i_rec.cのwidget配置を変更しました。これに伴う細かい変更を施しました。 今年のバージョンアップは、これで打ち止めです。i_rec for 98にまだ追い付 きません。来年に御期待下さい。 Linux版のテストはしていません。 ---ver0.34(99/12/23)--- fileio.cにバグがありました。 ROIの書き出しに部分が、以下のようになっています。 fprintf(fp,"Xmin %d\n",xs); fprintf(fp,"Ymin %d\n",xe); fprintf(fp,"Xmax %d\n",ys); fprintf(fp,"Ymax %d\n",ye); これは、明らかに、誤りです。正しくは以下のようになります。 fprintf(fp,"Xmin %d\n",xs); fprintf(fp,"Ymin %d\n",ys); fprintf(fp,"Xmax %d\n",xe); fprintf(fp,"Ymax %d\n",ye); i_rec.cを書き換え、widgetの配置を変更しました。 i_rec.c datawindow.cを書き換え、Expose、Configure時の ちらつきをなくしました。 明らかなバグだったので、すぐにバージョンアップしました。 年内にもう一度(できたら)、バージョンアップする予定です。 Linux版のテストはしていません。 ---ver0.33(99/12/22)--- thwindow.cに変更を加えました。src config windowに示される、ヒストグラ ムのちらつきをなくしました。ただし、表示コストがかかるため、環境によっ ては、処理落ちの可能性があります。パラメータの修正が終った後は、このウィ ンドウを閉じて下さい。また、thwindow.cの#define NO_FLICKERをコメントし てしまうと、以前と同じ表示方法になります。 fileio.c fileio.hを作成しました。これにより、設定が保存できるようにな りました。ホームディレクトリに、.i_recrcというファイルを作成し、パラメー タを保存します。保存は、自動的に行なわれます。上記に関連し、i_rec.c ep.c ep.h eph.hに変更を加えました。 年内にもう一度くらい、バージョンアップする予定です。 Linux版のテストはしていません。 ---ver0.32(99/12/07)--- datawindowがExposeした時の再描画にバグ発見しました。 GetDataPos2関数の p.x=P->x; p.x=P->y; は、 p.x=P->x; p.y=P->y; が正しいです。 画像入力の調節を一つのウィンドウにまとめました。 以前のものよりも、調節が容易になったと思います。 eph.c ep.cに改変を加えました。 ---ver0.31(99/12/01)--- ep.cに変更を加えました。ROIの最小を40x30に変更しました。 ROIを設定する際、マウスをドラッグせずにクリックをすると、 おかしな四角が出たり、四角が消去されずに残ったりするバグを修正しました 回転中心、回転半径を設定するインターフェースを変更しました。 注視点を設定するインターフェースを変更しました。 ---ver0.30(99/11/25)--- eph.h ep.cに変更を加えました(EPH_XSize,EPH_YSizeをep.cの中で利用する)。 角度表示に変更した際、datawindowの縦軸の単位が変更するようにしました。 StopInput時に、showwindowにて、ROIを表示するようにしました。 また、この際にマウスの操作によりROIが変更できるようにしました。 ただし、変更したROIの保存についてはまだ実装していません。 StopInput時に、無入力状態のdatawindowでマウス操作すると、数値演算エラーで プログラムが異常終了してしまうバグを修正しました。 ---ver0.29(99/11/18)--- bri conボタンを押した時の動作にバグがあったのを修正しました。 cal_or.cを追加し、目を動かすだけで、回転中心、回転半径を計算できるよう にしました。上記機能のため、i_rec.c datawindow.c showwindow.cのなどに も大きく変更を加えました。 回転中心、回転半径を計算した時、そのデータをファイルに記録するようにし ました。 計算した回転中心、回転半径を用いてカメラに対する角度で、視線の動きを 表示できるようにしました。表示面積を広くしました。 瞳孔画像の上に、最近30秒分の瞳孔中心を黄色でプロットするようにしました。 CONTECのD/Aコンバータ(DA12-8L(PC))を使用し、瞳孔中心位置またはカメラ に対する視線方向の角度を電圧で出力できるようにしました。 ---ver0.28(99/09/27)--- 選択した領域のフラットな部分の平均値を格納できるようになりました。 ---ver0.27(99/09/23)--- ep.c および ep.hをi_rec(for pc98) ver.2.0ベースのものに変更しました。 1)ep.cに内部状態を取得する関数を追加したこと。 2)閾値を決定するアルゴリズムが変更(一枚の画像だけでなく、連続する複数の 画像から閾値を決定できるようにする)。 3)内部関数の充実。 じつは、今までもi_rec(for pc98) ver2.0ベースを使っていたつもりだったの ですが、かなり古いバージョンのものを使用していたようです。(cal.exe ver6.0 ベースあたりでしょうか?)新しい関数を使用しようと考えて、ミス に気がつきました。 i_rec(for pc98)用のep.cからの変更点は、 _far -> 削除 _fmalloc -> malloc _ffree -> free #define ->削除 #define ->削除 #define ->削除 fopen文の"rb" -> "r" ep.cにおける構造体struct o_paraの定義を変更 EP_DetectOval関数を上記に合わせ変更 EPH_ReadX,EPH_ReadXP,EPH_ReadY,EPH_ReadYPを追加。 です。 datawindow.cに関数を追加しました。キャリブレーションの準備のための関数 です。動作確認用の値が、stdoutに出るようになっています。 ---ver0.26(99/09/18)--- datawindowでのラバーバンドの振舞を変更しました。 キャリブレーションの準備のための構造体および関数を用意しました。 ラバーバンドで囲った部分を、重なり無く構造体のリストに追加してゆく 関数を用意しました。 ラバーバンドの部分の平均値をstdoutに表示します(これは、動作確認用です)。 ラバーバンドで囲った部分の値をstdoutに表示します(これは、動作確認用です)。 ---ver0.25(99/09/08)--- brightness or contrastでUp Downの上限を過ぎるても、i_rec.cの内部変数に 反映されないバグを修正しました。 外見を変更しました。 brightness,contrastを初期値(Default)に戻すボタンをつけました。 キャリブレーションに備えボタン、ラベルを追加しました。 キャリブレーションについては、まだ動作しません。 i_rec.c の内部変数を整理しました(Threshold,Automaticを削除)。 ---ver0.24(99/08/20)--- XInitImage()はとくに無くても動作するため、消去しました。 XDestroyImageの使用を誤っていたため改善しました。 XFree()を使用しました。 詳細は、X Window ハンドブックを参照して下さい。 ./i_rec -helpなどとすると、異常終了するのを改修しました。 datawindow.cにおいて、描画にバグがあったのを改修しました。 DW_DrawData()に、bcount++という意味不明の箇所がありました。 これは、ver0.17->ver0.18のときに、紛れ込んだ模様です。 再度ファイルネームと関数名を変更しました。 video.c -> eph.c video.h -> eph.h Video_ -> EPH_ ビデオキャプチャーボードに依存する部分を、eph.c eph.hに集めました。関 数など内容を大幅に変更しました。見通しがだいぶ良くなったと思います。 それにともない、i_rec.c、showwindow.cも関連部分を変更しました。 この部分を変更することにより、異なるビデオキャプチャーボードを使用する ことができます。 Sun のディスプレイにおける24 bitに対応しました。 ---ver0.23(99/08/17)--- STOPしている時に、datawindowにラバーバンドが出現するようにしました。 acvc.c acvcinc.hの名前を、video.c video.hに改めました。 それに伴い、関数名を変更しました。 EPH_Read()をvideo.cに移しました。 中途半端なリリースです。 16bitにおける動作を確認しました。 ---ver0.22(99/08/05)--- Exposeイベントで変更のないwidgetまで再描画しないよう、i_rec.cの fallback_resources[]を改修しました。それに合わせ、関数をいくつか作り ました。 STOPしている時だけ、showwindowを再描画するように変更しました。 datawindow.cの再描画の際に、ゴミが残るのを修正しました。 ---ver0.21(99/08/04)--- SW_ DW_ ACVC_ で始まるグローバルな関数は、それぞれインクルードファイルを作りました。 showwindow.h datawindow.h acvcinc.h 最後がacvc.hでないのは、アルゴクラフとのドライバーのインクルードファイル名と ぶつかってしまうためです。 EXPOSEイベントに対応しました。ウィンドウが重なって隠れてしまったときな ど、最上面にウィンドウを移動した際に画面を復旧します。STOPで画面を止め て、xwdなどのコマンドで画面をキャプチャーする際に便利になります。 計測中でも動作しますが、計測に差障りがあるので、できる限り行なわないこ とが望ましいです。 EXPOSEイベントに対応するために、showwindow.cに SW_Expose() datawindow.cにDW_Expose()関数を設定しました。 ---ver0.20(99/08/02)--- 1)ep.cの構造体変更に関してエンバグしていたのを解消。 EP_DetectOval関数を改修。 2)datawindow.cを拡張。 a)グラフの原点を左下にしました。 b)グラフに目盛を入れました。 c)瞳孔の半径を表示するようにしました。 d)瞳孔を楕円で近似する際に使用した点の数を、reliabilityとして表示するようにしました。 e)tz?.datを作らないようにしました。 3)datawindow.cの変更にともないi_rec.cの一部変更しました。 XCloseDisplay()を追加しました。 4)datawindow.c 使用したGCを破棄するようにしました。 5)showwindow.c 使用したGCを破棄するようにしました。 ---ver0.19(99/08/02)--- 1)ep.cにおける構造体struct o_paraの定義を変更しました。ep.hを御覧下さい。 2)SW_DispImageのインターフェースを変更しました。 3)DW_DrawDataのインターフェースを変更しました。 4)showwindow.cの楕円描画ルーチンを変更しました。 a)二つのセグメントで書いていてたのを一つのセグメントで書くようにしました。 b)STEPANGLEの値を変えることにより、楕円の描画する多角形の角数を変更で きるようにしました。これにより、データ転送量の変更を行なうことができま す。180角形のとき(default STEPANGLE 2) 0.67Mbit/secですが、これを30角 形(STEPANGLE 12)にすると、データ転送量は、0.12Mbit/setまで減少します。 ネットワークがボトルネックになっていたり、X Serverが遅くて描画が間に合 わない時などに利用します。 5)それぞれの変更に対応するようにi_rec.cを変更しました。 もう少し変更が続きます。 ---ver0.18(99/07/23)--- datawindow.cを変更しました。stopを押すと、datawindow画面をクリアします。 その後、楕円を検出した際の、時間と瞳孔中心座標とファイルに出力するよう にしました。 一秒間に何枚の画像が処理できているかを終了時に表示するようにしました。 29.8fps以上出ていれば、処理遅れはないと考えて良いです。 ---ver0.17(99/07/23)--- 一時停止ボタンを作成しました。 acvc.cから、不要なプログラムを削除しました。 このプログラムは、PC98版のi_recをLinux上に移植するための、 開発途上の動作確認プログラムです。 ソースは、アルゴクラフトのソースの一部を改変して使用しています。 必要な機材等については、別の資料を参照して下さい。 ---ver0.16(99/07/22)--- showwindow.c datawindow.c の関数のインターフェースを変更しました。 ---ver0.15(99/07/22)--- 8 bit のカラーマップを持つX-Window systemに表示させた際、プログラムが 停止してしまうバグを修正。 acvc.cに次の一行を追加しました。 --- void acvcinit(Widget *w) { showWindow=w; disp=XtDisplay(*w); scr=XtScreen(*w); depth= DefaultDepthOfScreen (scr); vi=DefaultVisualOfScreen(scr); cm = DefaultColormapOfScreen (scr); -->この行を追加。 vcinit(); MakeDit(); } --- showwindowに描画する関数を、showwindow.cにまとめる。 datawindowに描画する関数を、datawindow.cにまとめる。 ---ver0.14(99/07/22)--- ビデオキャプチャーボード依存(acvc.hの関数を使用するもの)、アルゴクラ フトからのプログラムをacvc.cに分離しました。楕円描画部分を改良し、デー タ量を半分に削減しました。 ---ver0.13(99/07/19)--- 新たにwindowを付け加え、眼球中心の軌跡を表示するようにしました。98版に 比べ、画面の大きさが自由になるのは、大変楽です。 ---ver0.12(99/07/17)--- 1)pict/autoボタンが動作するようになりました。 pictをoffにすると、瞳孔の輪郭と中央部だけ描画するようになります。 10baseTで接続されたマシンにおいても、リアルタイムでの描画が可能となり ます。 autoボタンをoffにすると、閾値の自動設定が停止します。thsd(threshold)で 設定された閾値を用いて、輪郭を決定します。 2)モノクロモードでは、意味のないsatをなくし、thresholdを設定する パネルに変更しました。