diff --git a/ECTrainer2/ECTrainer.cpp b/ECTrainer2/ECTrainer.cpp index 77d3790..95e4bae 100644 --- a/ECTrainer2/ECTrainer.cpp +++ b/ECTrainer2/ECTrainer.cpp @@ -3,21 +3,25 @@ #include "ECTrainer.h" #include "ECTrainerGUI.h" #include "SceneCamera.h" +#include "Stimulus.h" // �R���X�g���N�^ ECTrainer::ECTrainer() : _pGui(NULL) , _pSceneCam(NULL) + , _pStimulus(NULL) , _Running(true) { _pGui = new ECTrainerGUI(this); _pSceneCam = new SceneCamera(this); + _pStimulus = new Stimulus(this); } // �f�X�g���N�^ ECTrainer::~ECTrainer() { if (_pGui) delete _pGui; if (_pSceneCam) delete _pSceneCam; + if (_pStimulus) delete _pStimulus; } // ������ @@ -40,6 +44,27 @@ return true; } +// �L�����u���[�V���� +void ECTrainer::Calib() { + _pStimulus->StartCalib(); +} + +// �J�n +void ECTrainer::Start() { + _pStimulus->StartImage(); +} + +// ����摜�o�b�t�@�ɉ摜��ݒ� +void ECTrainer::SetSceneBuffer(cv::Mat& img) { + _pGui->SetSceneBuffer(img); +} + +// �h���摜�o�b�t�@�ɉ摜��ݒ� +void ECTrainer::SetDispBuffer(cv::Mat& img) { + _pGui->SetDispBuffer(img); +} + +// ����J�����X���b�h�J�n�_ DWORD WINAPI ECTrainer::SceneCamThreadEntry(LPVOID lpParameter) { ((ECTrainer*)lpParameter)->_pSceneCam->MainLoop(); return 0; diff --git a/ECTrainer2/ECTrainer.h b/ECTrainer2/ECTrainer.h index 523e748..5e635cd 100644 --- a/ECTrainer2/ECTrainer.h +++ b/ECTrainer2/ECTrainer.h @@ -1,24 +1,31 @@ #pragma once #include +#include "myOpenCV.h" class ECTrainerGUI; class SceneCamera; +class Stimulus; class ECTrainer { private: ECTrainerGUI* _pGui; SceneCamera* _pSceneCam; + Stimulus* _pStimulus; bool _Running; - + // �X���b�h�J�n�_ static DWORD SceneCamThreadEntry(LPVOID lpParameter); public: ECTrainer(); ~ECTrainer(); bool Process(); + void Calib(); + void Start(); + void SetSceneBuffer(cv::Mat& img); + void SetDispBuffer(cv::Mat& img); + // �C�����C���֐� bool IsRunning() { return _Running; } void Stop() { _Running = false; } - ECTrainerGUI* GetGui() { return _pGui; } }; diff --git a/ECTrainer2/ECTrainer2.vcxproj b/ECTrainer2/ECTrainer2.vcxproj index c188ef5..b12ed55 100644 --- a/ECTrainer2/ECTrainer2.vcxproj +++ b/ECTrainer2/ECTrainer2.vcxproj @@ -146,6 +146,7 @@ + @@ -153,6 +154,7 @@ + diff --git a/ECTrainer2/ECTrainer2.vcxproj.filters b/ECTrainer2/ECTrainer2.vcxproj.filters index 3227260..2d1e91e 100644 --- a/ECTrainer2/ECTrainer2.vcxproj.filters +++ b/ECTrainer2/ECTrainer2.vcxproj.filters @@ -27,6 +27,9 @@ ソース ファイル + + ソース ファイル + @@ -44,5 +47,8 @@ ヘッダー ファイル + + ヘッダー ファイル + \ No newline at end of file diff --git a/ECTrainer2/ECTrainerGUI.cpp b/ECTrainer2/ECTrainerGUI.cpp index 4d79311..bfd97f3 100644 --- a/ECTrainer2/ECTrainerGUI.cpp +++ b/ECTrainer2/ECTrainerGUI.cpp @@ -10,10 +10,7 @@ #endif // �R���X�g���N�^ -ECTrainerGUI::ECTrainerGUI(ECTrainer* pEct) - :_pEct(pEct) -{ - +ECTrainerGUI::ECTrainerGUI(ECTrainer* pEct) :_pEct(pEct) { } // ������ @@ -29,18 +26,20 @@ // �}���`���j�^�̏ꍇ �T�u��ʂŃt���X�N���[���� cv::moveWindow(WIN_DISP, _Displays[1].left, _Displays[1].top); cv::setWindowProperty(WIN_DISP, cv::WND_PROP_FULLSCREEN, cv::WINDOW_FULLSCREEN); - _DispFrame.create(cv::Size(_Displays[1].right - _Displays[1].left, + _DispBuffer.create(cv::Size(_Displays[1].right - _Displays[1].left, _Displays[1].bottom - _Displays[1].top), CV_8UC3); } else { // �V���O�����j�^�̏ꍇ cv::moveWindow(WIN_DISP, _Displays[0].left, _Displays[0].top); - _DispFrame.create(cv::Size(640, 480), CV_8UC3); + _DispBuffer.create(cv::Size(640, 480), CV_8UC3); } - _Logo = cv::imread("../images/ECTrainerLogo640x91.png"); - _DispBuffer = cv::imread("../images/calib.png"); + cv::Mat opening = cv::imread("../images/ECTrainerLogo640x91.png"); + SetDispBuffer(opening); _SceneBuffer.create(SCENE_BUFFER_SIZE, CV_8UC3); _SceneBuffer = CV_RGB(0, 0, 0); + _Logo = cv::imread("../images/ECTrainerLogo640x91.png"); + //_DispBuffer = cv::imread("../images/calib.png"); return true; } @@ -48,29 +47,14 @@ // �C�x���g���[�v bool ECTrainerGUI::MainLoop() { while (_pEct->IsRunning() && cv::getWindowProperty(WIN_MAIN, 0) >= 0) { - // �\���E�C���h�E�t���[������ - _DispFrame = cv::Scalar(0, 0, 0); - cv::Rect roiRect; - if (_DispBuffer.rows * _DispFrame.cols / _DispFrame.rows > _DispBuffer.cols) { - roiRect.width = _DispBuffer.cols * _DispFrame.rows / _DispBuffer.rows; - roiRect.height = _DispFrame.rows; - } else { - roiRect.width = _DispFrame.cols; - roiRect.height = _DispBuffer.rows * _DispFrame.cols / _DispBuffer.cols; - } - roiRect.x = (_DispFrame.cols - roiRect.width) / 2; - roiRect.y = (_DispFrame.rows - roiRect.height) / 2; - cv::Mat roi(_DispFrame, roiRect); - cv::resize(_DispBuffer, roi, roi.size()); - // ���C���E�C���h�E�t���[������ _MainFrame = cv::Scalar(49, 52, 49); cvui::image(_MainFrame, 0, 0, _Logo); cvui::beginRow(_MainFrame, 10, 100, -1, -1, 10); cvui::beginColumn(-1, -1, 10); - if (cvui::button("Calibration")) ; - if (cvui::button("Start")); + if (cvui::button("Calibration")) _pEct->Calib(); + if (cvui::button("Start")) _pEct->Start(); if (cvui::button("Quit")) _pEct->Stop(); cvui::endColumn(); cvui::beginColumn(); @@ -80,21 +64,40 @@ cvui::endColumn(); cvui::endRow(); - // ��ʕ\�� cvui::update(); cv::imshow(WIN_MAIN, _MainFrame); - cv::imshow(WIN_DISP, _DispFrame); + cv::imshow(WIN_DISP, _DispBuffer); int key = cv::waitKey(1); if (key == KEY_ESC) _pEct->Stop(); } return true; } +// ����摜�o�b�t�@�ɉ摜��ݒ� void ECTrainerGUI::SetSceneBuffer(cv::Mat& img) { cv::resize(img, _SceneBuffer, SCENE_BUFFER_SIZE); } +// �h���摜�o�b�t�@�ɉ摜��ݒ� +void ECTrainerGUI::SetDispBuffer(cv::Mat& img) { + _DispBuffer = cv::Scalar(0, 0, 0); + cv::Rect roiRect; + if (img.rows * _DispBuffer.cols / _DispBuffer.rows > img.cols) { + roiRect.width = img.cols * _DispBuffer.rows / img.rows; + roiRect.height = _DispBuffer.rows; + } else { + roiRect.width = _DispBuffer.cols; + roiRect.height = img.rows * _DispBuffer.cols / img.cols; + } + roiRect.x = (_DispBuffer.cols - roiRect.width) / 2; + roiRect.y = (_DispBuffer.rows - roiRect.height) / 2; + if (roiRect.x + roiRect.width > _DispBuffer.cols) roiRect.width = _DispBuffer.cols - roiRect.x; + if (roiRect.y + roiRect.height > _DispBuffer.rows) roiRect.height = _DispBuffer.rows - roiRect.y; + cv::Mat roi(_DispBuffer, roiRect); + cv::resize(img, roi, roi.size()); +} + // �S�f�B�X�v���C�̏����擾 void ECTrainerGUI::GetDisplayInfo() { EnumDisplayMonitors(NULL, NULL, diff --git a/ECTrainer2/ECTrainerGUI.h b/ECTrainer2/ECTrainerGUI.h index 372c0df..735f859 100644 --- a/ECTrainer2/ECTrainerGUI.h +++ b/ECTrainer2/ECTrainerGUI.h @@ -12,16 +12,15 @@ private: const cv::String WIN_DISP = "ECTrainer Display"; const cv::String WIN_MAIN = "Eye Contact Trainer"; - const cv::Size SCENE_BUFFER_SIZE = cv::Size(320, 240); + const cv::Size SCENE_BUFFER_SIZE = cv::Size(320, 180); const int KEY_ESC = 27; ECTrainer* _pEct; std::vector _Displays; cv::Mat _MainFrame; // ���C���E�C���h�E�t���[�� - cv::Mat _DispFrame; // �h���\���E�C���h�E�t���[�� - cv::Mat _DispBuffer; // �h���\���R���e���c - cv::Mat _SceneBuffer; // ����摜�R���e���c - cv::Mat _Logo; + cv::Mat _DispBuffer; // �h���摜 + cv::Mat _SceneBuffer; // ����摜 + cv::Mat _Logo; // ���S void GetDisplayInfo(); static BOOL CALLBACK MonitorEnumProc(HMONITOR hMon, HDC hdcMon, LPRECT lpMon, LPARAM dwDate); @@ -31,4 +30,5 @@ bool Init(); bool MainLoop(); void SetSceneBuffer(cv::Mat &img); + void SetDispBuffer(cv::Mat& img); }; diff --git a/ECTrainer2/SceneCamera.cpp b/ECTrainer2/SceneCamera.cpp index 9db27cd..bbcddfe 100644 --- a/ECTrainer2/SceneCamera.cpp +++ b/ECTrainer2/SceneCamera.cpp @@ -4,7 +4,6 @@ #include "ECTrainer.h" #include "SceneCamera.h" -#include "ECTrainerGUI.h" // �R���X�g���N�^ SceneCamera::SceneCamera(ECTrainer* pEct) @@ -30,8 +29,7 @@ // �V�[���B�e cv::Mat scene; _SceneCam >> scene; - std::cout << scene.cols << "," << scene.rows << std::endl; - _pEct->GetGui()->SetSceneBuffer(scene); + _pEct->SetSceneBuffer(scene); } return true; diff --git a/ECTrainer2/Stimulus.cpp b/ECTrainer2/Stimulus.cpp new file mode 100644 index 0000000..b8ca59a --- /dev/null +++ b/ECTrainer2/Stimulus.cpp @@ -0,0 +1,20 @@ + +#include "Stimulus.h" + +#include "ECTrainer.h" + +// �R���X�g���N�^ +Stimulus::Stimulus(ECTrainer* pEct) :_pEct(pEct) { +} + +// �L�����u���[�V�����J�n +void Stimulus::StartCalib() { + cv::Mat calibImg = cv::imread(CALIB_FILE); + _pEct->SetDispBuffer(calibImg); +} + +// �h���摜�J�n +void Stimulus::StartImage() { + cv::Mat img = cv::imread("../images/lena.jpg"); + _pEct->SetDispBuffer(img); +} diff --git a/ECTrainer2/Stimulus.h b/ECTrainer2/Stimulus.h new file mode 100644 index 0000000..013a684 --- /dev/null +++ b/ECTrainer2/Stimulus.h @@ -0,0 +1,18 @@ +#pragma once + +#include "myOpenCV.h" + +class ECTrainer; + +class Stimulus +{ + const cv::String CALIB_FILE = "../images/calib.png"; + + ECTrainer* _pEct; + +public: + Stimulus(ECTrainer* pEct); + void StartCalib(); + void StartImage(); + void StartMovie(); +}; diff --git a/images/lena.jpg b/images/lena.jpg new file mode 100644 index 0000000..0fdf25d --- /dev/null +++ b/images/lena.jpg Binary files differ