diff --git a/ECTrainer2/ECTrainerGUI.cpp b/ECTrainer2/ECTrainerGUI.cpp index f14b0a1..723cac8 100644 --- a/ECTrainer2/ECTrainerGUI.cpp +++ b/ECTrainer2/ECTrainerGUI.cpp @@ -35,14 +35,14 @@ , _SceneBufferScale(1.F) , _PlayIndex(0) { - _MovieFiles.push_back(_T("../movies/instruction.avi")); - _MovieFiles.push_back(_T("../movies/test4.avi")); - _MovieFiles.push_back(_T("../movies/instruction.avi")); - _MovieFiles.push_back(_T("../movies/test1.avi")); - _MovieFiles.push_back(_T("../movies/instruction.avi")); - _MovieFiles.push_back(_T("../movies/test3.avi")); - _MovieFiles.push_back(_T("../movies/instruction.avi")); - _MovieFiles.push_back(_T("../movies/test2.avi")); + //_MovieFiles.push_back(_T("../movies/instruction.avi")); + //_MovieFiles.push_back(_T("../movies/test4.avi")); + //_MovieFiles.push_back(_T("../movies/instruction.avi")); + //_MovieFiles.push_back(_T("../movies/test1.avi")); + //_MovieFiles.push_back(_T("../movies/instruction.avi")); + //_MovieFiles.push_back(_T("../movies/test3.avi")); + //_MovieFiles.push_back(_T("../movies/instruction.avi")); + //_MovieFiles.push_back(_T("../movies/test2.avi")); } // �f�X�g���N�^ @@ -242,7 +242,7 @@ cvui::beginColumn(_MainFrame, 10, 100, 140, -1, 10); if (fStimulus) { if (cvui::button(140, 30, "STOP")) { - //if (!StopMovie()) _pEct->Stop(); + if (!StopMovie()) _pEct->Stop(); //fKeepContact = false; _pEct->StopStim(); fStimulus = false; diff --git a/ECTrainer2/ECTrainerGUI.h b/ECTrainer2/ECTrainerGUI.h index f5420a9..c06c886 100644 --- a/ECTrainer2/ECTrainerGUI.h +++ b/ECTrainer2/ECTrainerGUI.h @@ -25,7 +25,7 @@ const cv::Point DISP_IMAGE_POS = cv::Point(820, 120); const int KEY_ESC = 27; - std::vector _MovieFiles; + //std::vector _MovieFiles; std::vector _Displays; cv::Mat _MainFrame; // ���C���E�C���h�E�t���[�� cv::Mat _DispImage; // �h���摜 diff --git a/ECTrainer2/MyWinUtils.h b/ECTrainer2/MyWinUtils.h index bd2cf79..a577d5d 100644 --- a/ECTrainer2/MyWinUtils.h +++ b/ECTrainer2/MyWinUtils.h @@ -5,6 +5,7 @@ #include #include #include +#include // �}���`�o�C�g����������C�h������iUNICODE�j�ɕϊ� std::wstring Multi2Wide(std::string const& src) @@ -27,10 +28,38 @@ int len = _vsctprintf(format, args) + 1; TCHAR* buf = (TCHAR*)malloc(len * sizeof(TCHAR)); - len = _vstprintf_s(buf, len - 1, format, args); + len = _vstprintf_s(buf, len, format, args); OutputDebugString(buf); free(buf); return len; } + +bool ReadTable(const std::string& filename, std::vector>& table, const char delimiter = ',') +{ + // �t�@�C�����J�� + std::fstream filestream(filename); + if (!filestream.is_open()) return false; // �t�@�C�����J���Ȃ������ꍇ�͏I�� + + // �t�@�C����ǂݍ��� + while (!filestream.eof()) { + // �P�s�ǂݍ��� + std::string buffer; + filestream >> buffer; + + // �t�@�C������ǂݍ��񂾂P�s�̕��������؂蕶���ŕ����ă��X�g�ɒlj����� + std::vector record; // �P�s���̕�����̃��X�g + std::istringstream streambuffer(buffer); // ������X�g���[�� + std::string token; // �P�Z�����̕����� + while (std::getline(streambuffer, token, delimiter)) { + // �P�Z�����̕���������X�g�ɒlj����� + record.push_back(token); + } + + // �P�s���̕�������o�͈����̃��X�g�ɒlj����� + table.push_back(record); + } + + return true; +} \ No newline at end of file diff --git a/ECTrainer2/StimDataS.txt b/ECTrainer2/StimDataS.txt new file mode 100644 index 0000000..8a627dd --- /dev/null +++ b/ECTrainer2/StimDataS.txt @@ -0,0 +1 @@ +2 ../movies/visit01_004re.avi 30 ../movies/visit01_004.csv 2 diff --git a/ECTrainer2/Stimulus.cpp b/ECTrainer2/Stimulus.cpp index bf4b6b2..f1cd002 100644 --- a/ECTrainer2/Stimulus.cpp +++ b/ECTrainer2/Stimulus.cpp @@ -13,6 +13,7 @@ :BaseProcess(pEct) , _pMarker(pMarker) , _StimNo(-1) + , _StartTime(0) { } @@ -77,6 +78,9 @@ std::wstring mov = Multi2Wide(_StimInfoSet[_StimNo].filename); _pEct->SetMovieToShow(mov); } + if (_StimInfoSet[_StimNo].csvfile[0] != '_') { + this->ReadCsv(); + } return true; } @@ -127,3 +131,27 @@ // img.copyTo(_DispBuffer); //} +// CSV�ǂݍ��� +void Stimulus::ReadCsv() { + if (_StimInfoSet[_StimNo].frame.size() > 0) return; // �ǂݍ��ݍς� + std::vector> table; + if (!ReadTable(_StimInfoSet[_StimNo].csvfile, table)) return; + if (table.size() < 2) return; + + for (int r = 1; r < table.size(); r++) { + if (table[r].size() < 5) continue; + FrameInfo fi; + fi.time = (float)atof(table[r][0].c_str()); + fi.target.push_back(TargetInfo( + (float)atof(table[r][1].c_str()), + (float)atof(table[r][2].c_str()), 10.F)); + fi.target.push_back(TargetInfo( + (float)atof(table[r][3].c_str()), + (float)atof(table[r][4].c_str()), 10.F)); + _StimInfoSet[_StimNo].frame.push_back(fi); + } + + DebugPrintf(_T("CSV file '%s' - %d frames read.\n"), + Multi2Wide(_StimInfoSet[_StimNo].csvfile).c_str(), + _StimInfoSet[_StimNo].frame.size()); +} diff --git a/ECTrainer2/Stimulus.h b/ECTrainer2/Stimulus.h index ffd5be7..2934760 100644 --- a/ECTrainer2/Stimulus.h +++ b/ECTrainer2/Stimulus.h @@ -9,10 +9,20 @@ class Marker; -//struct StimImage { -// cv::String filename; -// cv::Point2f eyes[2]; -//}; + +struct TargetInfo { + cv::Point2f pos; + float size; + TargetInfo(float x, float y, float s) { + pos = cv::Point2f(x, y); + size = s; + } +}; + +struct FrameInfo { + float time; + std::vector target; +}; struct StimInfo { int type; // 1:�摜 2:���� @@ -20,6 +30,7 @@ float dulation; // ����(sec) std::string csvfile; // �^�[�Q�b�g���W�t�@�C���i�����ꍇ��_�A���_�[�o�[�j int target; // �^�[�Q�b�g�i�����ꍇ��0�j + std::vector frame; }; class Stimulus : public BaseProcess @@ -32,7 +43,7 @@ const cv::String CALIB_COMPLETE_FILE = "../images/CalibComplete.png"; const cv::String CALIB_FAILED_FILE = "../images/CalibFailed.png"; const cv::String WHITE_FILE = "../images/white.png"; - const std::string DATA_FILE = "StimData.txt"; + const std::string DATA_FILE = "StimDataS.txt"; Marker* _pMarker; cv::Mat _DispBuffer; std::vector _StimInfoSet; @@ -42,6 +53,7 @@ //void StimWithMarker(); bool SetStimulus(); + void ReadCsv(); public: Stimulus(ECTrainer* pEct, Marker* pMarker); bool Init(); diff --git a/images/visit01_004.png b/images/visit01_004.png new file mode 100644 index 0000000..df2ae82 --- /dev/null +++ b/images/visit01_004.png Binary files differ