diff --git a/ECTrainer2/ECTrainerGUI.cpp b/ECTrainer2/ECTrainerGUI.cpp index b827c59..461b7b9 100644 --- a/ECTrainer2/ECTrainerGUI.cpp +++ b/ECTrainer2/ECTrainerGUI.cpp @@ -120,6 +120,7 @@ //cvui::text(fContact ? "Eyes Contact!" : "No contact"); break; } + cvui::printf("Training Level %d", Ect()->PWorker()->GetTrainingLevel()); cvui::printf("View Gaze %.0f, %.0f", Ect()->PEyeTrack()->GetGazeV().x, Ect()->PEyeTrack()->GetGazeV().y); //cvui::printf("Img Gaze %.2f, %.2f", Ect()->GetGazeI().x, Ect()->GetGazeI().y); cvui::text(Ect()->PMarker()->IsDetected() ? "AR Markers OK" : "AR Markers NG"); diff --git a/ECTrainer2/Stimulus.h b/ECTrainer2/Stimulus.h index fcae521..fc3f398 100644 --- a/ECTrainer2/Stimulus.h +++ b/ECTrainer2/Stimulus.h @@ -44,7 +44,7 @@ nkc::RingBuffer _Display; // 表示画像 nkc::RingBuffer _Movie; // 動画情報 cv::VideoCapture _cap; // 動画オブジェクト - float _TotalExpTime; + float _TotalExpTime; // 合計実験時間 // ECTrainerインスタンス取得 ECTrainer* Ect() { return (ECTrainer*)_pUserdata; } diff --git a/ECTrainer2/Worker.cpp b/ECTrainer2/Worker.cpp index 843779c..da76f7f 100644 --- a/ECTrainer2/Worker.cpp +++ b/ECTrainer2/Worker.cpp @@ -20,6 +20,7 @@ , _TargetImage() , _FullScreenImage() , _FBLevel(1) + , _TrainingLevel(1) { _pExpTimer = new nkc::HPTimer(); _pContactTimer = new nkc::HPTimer(); @@ -46,10 +47,6 @@ // 視線情報更新を待つ if (::WaitForSingleObject(_Trigger, 1) == WAIT_TIMEOUT) return false; - //if (!Ect()->PEyeTrack()->IsNewGazeV()) { - // Sleep(0); - // return false; - //} cv::Point2f gazeV = (Ect()->PEyeTrack()->GetGazeV()); int stimNo = Ect()->PStimulus()->GetStimNo(); @@ -77,14 +74,16 @@ // ターゲット描画 auto target = cv::Point2f(elems[e].x, elems[e].y); if (elems[e].d > 0) { - cv::circle(stimImg, target * scale, (int)(elems[e].d * scale), CV_RGB(255, 0, 0), 2); - } - if (gazeI.x >= 0) { - // ターゲット判定 - auto dt = cv::norm(gazeI - target); - if (dt < elems[e].d && (hit < 0 || dt < dtMin)) { - hit = e; - dtMin = dt; + float dMod = elems[e].d * (1.0F - TRAINING_LEVEL_EFFECT * (_TrainingLevel - 1)); + cv::circle(stimImg, target * scale, (int)(dMod * scale), CV_RGB(255, 0, 0), 2); + + if (gazeI.x >= 0) { + // ターゲット判定 + auto dt = cv::norm(gazeI - target); + if (dt < dMod && (hit < 0 || dt < dtMin)) { + hit = e; + dtMin = dt; + } } } } @@ -99,7 +98,10 @@ if (_ContactTime >= (double)(FEEDBACK_TIME * _FBLevel)) { this->PostMsg((int)ECTMSG::FB_OK + _FBLevel - 1); fb = _FBLevel++; - if (_FBLevel > 5) this->ResetParams(); // 最終FB後にリセット + if (_FBLevel > 5) { + _TrainingLevel++; + this->ResetParams(); // 最終FB後にリセット + } } } } diff --git a/ECTrainer2/Worker.h b/ECTrainer2/Worker.h index 0ee7f70..e5619bb 100644 --- a/ECTrainer2/Worker.h +++ b/ECTrainer2/Worker.h @@ -27,17 +27,19 @@ const TCHAR* DATA_LOG_FILE = _T("LogData"); const TCHAR* EVENT_LOG_FILE = _T("LogEvent.txt"); const int FEEDBACK_TIME = 3000; // フィードバックの時間(1レベル)msec - APP_STATUS _AppStatus; // アプリケーション状態 - FILE* _fpLogData; // データログファイルポインタ - nkc::HPTimer* _pExpTimer; // 実験経過タイマー + const float TRAINING_LEVEL_EFFECT = 0.1F; // トレーニングレベルによる目標領域縮小量 + APP_STATUS _AppStatus; // アプリケーション状態 + FILE* _fpLogData; // データログファイルポインタ + nkc::HPTimer* _pExpTimer; // 実験経過タイマー nkc::HPTimer* _pContactTimer; // 目標コンタクトタイマー //mwut::HPTimer* _pNohitTimer; // 視線外れ時間 - double _ContactTime; // コンタクト累積時間 + double _ContactTime; // コンタクト累積時間 nkc::RingBuffer _TargetImage; // ターゲット画像 - cv::Mat _StimImage; // 刺激画像 + cv::Mat _StimImage; // 刺激画像 nkc::RingBuffer _FullScreenImage; // 全画面用画像 - int _FBLevel; // フィードバックレベル 1~5 - HANDLE _Trigger; // 処理開始トリガ + int _FBLevel; // フィードバックレベル 1~5 + HANDLE _Trigger; // 処理開始トリガ + int _TrainingLevel; // トレーニングレベル(高いほど難度UP) // ECTrainerインスタンス取得 ECTrainer* Ect() { return (ECTrainer*)_pUserdata; } @@ -77,4 +79,6 @@ double GetExpTime(); // トリガーセット void SetTrigger() { ::SetEvent(_Trigger); } + // トレーニングレベル取得 + int GetTrainingLevel() { return _TrainingLevel; } }; diff --git a/README.md b/README.md index 5a789a3..938488b 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## 開発環境 - Visual C++ 2019 -- OpenCV 4.2.0 +- OpenCV 4.3.0 - GStreamer 1.16.2 - TBB - cvui 2.7.0 @@ -15,11 +15,9 @@ \\NLAB-FS\Data2\EyeContact\コンテンツ\システム使用 ## 開発タスク -- worker の視線情報更新を待ちを Sleep(0)から Event に変更する - 状態変数:IDLEをキャリブ前後で分ける - Pause機能(復旧は即時か,刺激最初からか) - Next,Prev -- レベルアップ(excellent) # ECTrainer1 プロジェクト ### アイコンタクト支援ソフトウェア Ver 1