diff --git a/ECTrainer2/ECTrainerGUI.cpp b/ECTrainer2/ECTrainerGUI.cpp index 4958c7f..c348586 100644 --- a/ECTrainer2/ECTrainerGUI.cpp +++ b/ECTrainer2/ECTrainerGUI.cpp @@ -42,10 +42,9 @@ _DispBuffer.create(cv::Size(640, 480), CV_8UC3); cv::moveWindow(WIN_MAIN, _Displays[0].left + 100, _Displays[0].top + 100); } - cv::Mat opening = cv::imread("../images/ECTrainerLogo640x91.png"); - SetDispBuffer(opening); - _SceneBuffer.create(SCENE_BUFFER_SIZE, CV_8UC3); - _SceneBuffer = CV_RGB(0, 0, 0); + cv::Mat blank(cv::Size(IMAGE_WIDTH, 480), CV_8UC3, cv::Scalar(0)); + blank.copyTo(_SceneBuffer); + blank.copyTo(_DispImage); _Logo = cv::imread("../images/ECTrainerLogo640x91.png"); return true; @@ -53,43 +52,51 @@ // �C�x���g���[�v bool ECTrainerGUI::MainLoop() { + while (_pEct->IsRunning() && cv::getWindowProperty(WIN_MAIN, 0) >= 0) { - // ���C���E�C���h�E�t���[������ + // ���C���E�C���h�E�t���[���N���A _MainFrame = cv::Scalar(49, 52, 49); // �}�E�X�J�[�\���𒍎��_�Ƃ��鏈�� //cvui::rect(_MainFrame, SCENE_BUFFER_POS.x, SCENE_BUFFER_POS.y, // SCENE_BUFFER_SIZE.width, SCENE_BUFFER_SIZE.height, 0xFF0000); cv::Point mp = cvui::mouse(WIN_MAIN); - if (cvui::iarea(SCENE_BUFFER_POS.x, SCENE_BUFFER_POS.y, SCENE_BUFFER_SIZE.width, SCENE_BUFFER_SIZE.height) == cvui::DOWN) { + if (cvui::iarea(SCENE_BUFFER_POS.x, SCENE_BUFFER_POS.y, IMAGE_WIDTH, _SceneBufferHeight) == cvui::DOWN) { _pEct->SetGazeV(cv::Point(mp.x - SCENE_BUFFER_POS.x, mp.y - SCENE_BUFFER_POS.y)); } else { _pEct->SetGazeV(cv::Point(-1, -1)); } - cvui::image(_MainFrame, 0, 0, _Logo); - cvui::beginRow(_MainFrame, 10, 100, -1, -1, 10); - cvui::beginColumn(120, -1, 10); - if (cvui::button(120, 30, "Calibration")) _pEct->Calib(); - if (cvui::button(120, 30, "Start")) _pEct->Start(); - cvui::printf("Mouse %d,%d", mp.x, mp.y); - cvui::printf("GazeV %d,%d", _pEct->GetGazeV().x, _pEct->GetGazeV().y); - cvui::printf("GazeI %.2f,%.2f", _pEct->GetGazeI().x, _pEct->GetGazeI().y); - if (cvui::button(120, 30, "Quit")) _pEct->Stop(); - cvui::endColumn(); - cvui::beginColumn(); - cvui::image(_SceneBuffer); - cvui::space(); - cvui::text(_pEct->GetHomographyStatus() ? "Homography OK" : "No homography"); - cvui::endColumn(); - cvui::endRow(); + // �h���摜 + if (_pEct->GetGazeI().x >= 0) { + cv::circle(_DispImage, + cv::Point((int)(_DispImage.cols * _pEct->GetGazeI().x), (int)(_DispImage.rows * _pEct->GetGazeI().y)), + (int)(_DispImage.rows * 0.03), CV_RGB(0, 0, 255), 1); + } + // UI�`�� + cvui::image(_MainFrame, 0, 0, _Logo); + cvui::beginColumn(_MainFrame, 10, 100, 140, -1, 10); + if (cvui::button(140, 30, "CALIBRATION")) _pEct->Calib(); + if (cvui::button(140, 30, "START")) _pEct->Start(); + cvui::printf("Mouse %d,%d", mp.x, mp.y); + cvui::printf("View Gaze %d,%d", _pEct->GetGazeV().x, _pEct->GetGazeV().y); + cvui::printf("Img Gaze %.2f,%.2f", _pEct->GetGazeI().x, _pEct->GetGazeI().y); + cvui::text(_pEct->GetHomographyStatus() ? "Homography OK" : "No homography"); + bool snapshot = cvui::button(140, 30, "SNAPSHOT"); + if (cvui::button(140, 30, "QUIT")) _pEct->Stop(); + cvui::endColumn(); + cvui::text(_MainFrame, SCENE_BUFFER_POS.x, 100, "SCENE CAMERA"); + cvui::image(_MainFrame, SCENE_BUFFER_POS.x, SCENE_BUFFER_POS.y, _SceneBuffer); + cvui::text(_MainFrame, DISP_IMAGE_POS.x, 100, "STIMULUS IMAGE"); + cvui::image(_MainFrame, DISP_IMAGE_POS.x, DISP_IMAGE_POS.y, _DispImage); // ��ʕ\�� cvui::update(); cv::imshow(WIN_MAIN, _MainFrame); cv::imshow(WIN_DISP, _DispBuffer); + if (snapshot) cv::imwrite("d:/usr/dl/snapshot.jpg", _MainFrame); int key = cv::waitKey(1); if (key == KEY_ESC) _pEct->Stop(); } @@ -98,26 +105,31 @@ // ����摜�o�b�t�@�ɉ摜��ݒ� void ECTrainerGUI::SetSceneBuffer(cv::Mat& img) { - cv::resize(img, _SceneBuffer, SCENE_BUFFER_SIZE); + _SceneBufferHeight = img.rows * IMAGE_WIDTH / img.cols; + cv::resize(img, _SceneBuffer, cv::Size(IMAGE_WIDTH, _SceneBufferHeight)); } // �h���摜�o�b�t�@�ɉ摜��ݒ� void ECTrainerGUI::SetDispBuffer(cv::Mat& img) { - _DispBuffer = cv::Scalar(0, 0, 0); + _DispImageHeight = img.rows * IMAGE_WIDTH / img.cols; + cv::resize(img, _DispImage, cv::Size(IMAGE_WIDTH, _DispImageHeight)); + + cv::Mat buf(_DispBuffer.size(), CV_8UC3, cv::Scalar(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; + if (img.rows * buf.cols / buf.rows > img.cols) { + roiRect.width = img.cols * buf.rows / img.rows; + roiRect.height = buf.rows; } else { - roiRect.width = _DispBuffer.cols; - roiRect.height = img.rows * _DispBuffer.cols / img.cols; + roiRect.width = buf.cols; + roiRect.height = img.rows * buf.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); + roiRect.x = (buf.cols - roiRect.width) / 2; + roiRect.y = (buf.rows - roiRect.height) / 2; + if (roiRect.x + roiRect.width > buf.cols) roiRect.width = buf.cols - roiRect.x; + if (roiRect.y + roiRect.height > buf.rows) roiRect.height = buf.rows - roiRect.y; + cv::Mat roi(buf, roiRect); cv::resize(img, roi, roi.size()); + buf.copyTo(_DispBuffer); } // �S�f�B�X�v���C�̏����擾 diff --git a/ECTrainer2/ECTrainerGUI.h b/ECTrainer2/ECTrainerGUI.h index 91722ec..fb7f926 100644 --- a/ECTrainer2/ECTrainerGUI.h +++ b/ECTrainer2/ECTrainerGUI.h @@ -11,18 +11,20 @@ private: const cv::String WIN_DISP = "ECTrainer Display"; const cv::String WIN_MAIN = "Eye Contact Trainer"; - //const cv::Size MAIN_FRAME_SIZE = cv::Size(640, 400); - //const cv::Size SCENE_BUFFER_SIZE = cv::Size(320, 180); - const cv::Size MAIN_FRAME_SIZE = cv::Size(1000, 650); - const cv::Size SCENE_BUFFER_SIZE = cv::Size(640, 480); - const cv::Point SCENE_BUFFER_POS = cv::Point(140, 100); + const cv::Size MAIN_FRAME_SIZE = cv::Size(1480, 620); + const int IMAGE_WIDTH = 640; + const cv::Point SCENE_BUFFER_POS = cv::Point(170, 120); + const cv::Point DISP_IMAGE_POS = cv::Point(820, 120); const int KEY_ESC = 27; std::vector _Displays; cv::Mat _MainFrame; // ���C���E�C���h�E�t���[�� - cv::Mat _DispBuffer; // �h���摜 + cv::Mat _DispImage; // �h���摜 + cv::Mat _DispBuffer; // �h����� cv::Mat _SceneBuffer; // ����摜 cv::Mat _Logo; // ���S + int _SceneBufferHeight; + int _DispImageHeight; void GetDisplayInfo(); static BOOL CALLBACK MonitorEnumProc(HMONITOR hMon, HDC hdcMon, LPRECT lpMon, LPARAM dwDate); diff --git a/ECTrainer2/EyeTrack.cpp b/ECTrainer2/EyeTrack.cpp index 6e735bc..30ba5f4 100644 --- a/ECTrainer2/EyeTrack.cpp +++ b/ECTrainer2/EyeTrack.cpp @@ -18,6 +18,8 @@ while (_pEct->IsRunning()) { if (_GazeV.x >= 0 && _GazeV.y >= 0) { _GazeI = _pMarker->ConvV2I(_GazeV); + } else { + _GazeI = cv::Point2f(-1.F, -1.F); } Sleep(1); } diff --git a/ECTrainer2/Marker.h b/ECTrainer2/Marker.h index c8cc505..caee3a8 100644 --- a/ECTrainer2/Marker.h +++ b/ECTrainer2/Marker.h @@ -5,7 +5,7 @@ class Marker { - const cv::Point2f MARGIN = cv::Size2f(0.05F, 0.05F); + const cv::Point2f MARGIN = cv::Size2f(0.02F, 0.02F); const float OUTER_MARGIN = 0.01F; const float HEIGHT = 0.1F; diff --git a/ECTrainer2/Stimulus.cpp b/ECTrainer2/Stimulus.cpp index 918b0c9..332ca08 100644 --- a/ECTrainer2/Stimulus.cpp +++ b/ECTrainer2/Stimulus.cpp @@ -9,10 +9,18 @@ :BaseProcess(pEct), _pMarker(pMarker) { } +// ������ +bool Stimulus::Init() { + _DispBuffer = cv::imread(OPENING_FILE); + return true; +} + // ���[�v bool Stimulus::MainLoop() { while (_pEct->IsRunning()) { - Sleep(100); + + _pEct->SetDispBuffer(_DispBuffer); + Sleep(30); } return true; @@ -21,14 +29,12 @@ // �L�����u���[�V�����J�n void Stimulus::StartCalib() { - cv::Mat calibImg = cv::imread(CALIB_FILE); - _pEct->SetDispBuffer(calibImg); + _DispBuffer = cv::imread(CALIB_FILE); } // �h���摜�J�n void Stimulus::StartImage() { - cv::Mat img = cv::imread("../images/lena.jpg"); - _pMarker->Generate(img.size()); - _pMarker->DrawMarker(img); - _pEct->SetDispBuffer(img); + _DispBuffer = cv::imread("../images/lena.jpg"); + _pMarker->Generate(_DispBuffer.size()); + _pMarker->DrawMarker(_DispBuffer); } diff --git a/ECTrainer2/Stimulus.h b/ECTrainer2/Stimulus.h index 69e427e..edec8eb 100644 --- a/ECTrainer2/Stimulus.h +++ b/ECTrainer2/Stimulus.h @@ -7,11 +7,14 @@ class Stimulus : public BaseProcess { + const cv::String OPENING_FILE = "../images/ECTrainerLogo640x91.png"; const cv::String CALIB_FILE = "../images/calib.png"; Marker* _pMarker; + cv::Mat _DispBuffer; public: Stimulus(ECTrainer* pEct, Marker* pMarker); + bool Init(); bool MainLoop(); void StartCalib(); void StartImage();