diff --git a/ECTrainer2/ECTrainer.cpp b/ECTrainer2/ECTrainer.cpp index 28a51f0..2f99c08 100644 --- a/ECTrainer2/ECTrainer.cpp +++ b/ECTrainer2/ECTrainer.cpp @@ -23,7 +23,7 @@ _pImageProc = new ImageProc(this, _pMarker); _pSceneCam = new SceneCamera(this, _pImageProc); _pStimulus = new Stimulus(this, _pMarker); - _pEyeTrack = new EyeTrack(this); + _pEyeTrack = new EyeTrack(this, _pMarker); } // �f�X�g���N�^ @@ -48,7 +48,7 @@ HANDLE hThreadSceneCam = CreateThread(NULL, 0, SceneCamThreadEntry, this, 0, &dwThreadIdSceneCam); HANDLE hThreadStimulus = CreateThread(NULL, 0, StimulusThreadEntry, this, 0, &dwThreadIdStimulus); HANDLE hThreadImageProc = CreateThread(NULL, 0, ImageProcThreadEntry, this, 0, &dwThreadIdImageProc); - HANDLE hThreadEyeTrack = CreateThread(NULL, 0, ImageProcThreadEntry, this, 0, &dwThreadIdEyeTrack); + HANDLE hThreadEyeTrack = CreateThread(NULL, 0, EyeTrackThreadEntry, this, 0, &dwThreadIdEyeTrack); _pGui->MainLoop(); @@ -104,3 +104,24 @@ ((ECTrainer*)lpParameter)->_pImageProc->MainLoop(); return 0; } + +// �����_�X���b�h�J�n�_ +DWORD WINAPI ECTrainer::EyeTrackThreadEntry(LPVOID lpParameter) { + ((ECTrainer*)lpParameter)->_pEyeTrack->MainLoop(); + return 0; +} + +// ����摜���̒����_�ݒ� +void ECTrainer::SetGazeV(cv::Point gazeV) { + _pEyeTrack->SetGazeV(gazeV); +} + +// ����摜���̒����_�擾 +cv::Point ECTrainer::GetGazeV() { + return _pEyeTrack->GetGazeV(); +} + +// �h���摜���̒����_�擾 +cv::Point2f ECTrainer::GetGazeI() { + return _pEyeTrack->GetGazeI(); +} diff --git a/ECTrainer2/ECTrainer.h b/ECTrainer2/ECTrainer.h index 72c79dc..426a7d8 100644 --- a/ECTrainer2/ECTrainer.h +++ b/ECTrainer2/ECTrainer.h @@ -26,6 +26,7 @@ static DWORD SceneCamThreadEntry(LPVOID lpParameter); static DWORD StimulusThreadEntry(LPVOID lpParameter); static DWORD ImageProcThreadEntry(LPVOID lpParameter); + static DWORD EyeTrackThreadEntry(LPVOID lpParameter); public: ECTrainer(); @@ -35,6 +36,9 @@ void Start(); void SetSceneBuffer(cv::Mat& img); void SetDispBuffer(cv::Mat& img); + void SetGazeV(cv::Point gazeV); + cv::Point GetGazeV(); + cv::Point2f GetGazeI(); // �C�����C���֐� bool IsRunning() { return _Running; } void Stop() { _Running = false; } diff --git a/ECTrainer2/ECTrainerGUI.cpp b/ECTrainer2/ECTrainerGUI.cpp index 3ccee5e..4958c7f 100644 --- a/ECTrainer2/ECTrainerGUI.cpp +++ b/ECTrainer2/ECTrainerGUI.cpp @@ -57,14 +57,26 @@ // ���C���E�C���h�E�t���[������ _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) { + _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(100, -1, 10); - if (cvui::button(100, 20, "Calibration")) _pEct->Calib(); - if (cvui::button(100, 20, "Start")) _pEct->Start(); - if (cvui::button(100, 20, "Quit")) _pEct->Stop(); - cvui::printf("mouse %d,%d", mp.x, mp.y); + 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); @@ -72,7 +84,7 @@ cvui::text(_pEct->GetHomographyStatus() ? "Homography OK" : "No homography"); cvui::endColumn(); cvui::endRow(); - cvui::rect(_MainFrame, 120, 100, SCENE_BUFFER_SIZE.width, SCENE_BUFFER_SIZE.height, 0xFF0000); + // ��ʕ\�� cvui::update(); diff --git a/ECTrainer2/ECTrainerGUI.h b/ECTrainer2/ECTrainerGUI.h index 48e4677..91722ec 100644 --- a/ECTrainer2/ECTrainerGUI.h +++ b/ECTrainer2/ECTrainerGUI.h @@ -15,6 +15,7 @@ //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 int KEY_ESC = 27; std::vector _Displays; diff --git a/ECTrainer2/EyeTrack.cpp b/ECTrainer2/EyeTrack.cpp index 704f9ad..6e735bc 100644 --- a/ECTrainer2/EyeTrack.cpp +++ b/ECTrainer2/EyeTrack.cpp @@ -1,7 +1,26 @@ #include "EyeTrack.h" #include "ECTrainer.h" +#include "Marker.h" +#include // �R���X�g���N�^ -EyeTrack::EyeTrack(ECTrainer* pEct) :BaseProcess(pEct) { +EyeTrack::EyeTrack(ECTrainer* pEct, Marker* pMarker) + : BaseProcess(pEct) + , _pMarker(pMarker) + , _GazeV(-1, -1) + , _GazeI(-1.F, -1.F) +{ +} + +// ���[�v +bool EyeTrack::MainLoop() { + while (_pEct->IsRunning()) { + if (_GazeV.x >= 0 && _GazeV.y >= 0) { + _GazeI = _pMarker->ConvV2I(_GazeV); + } + Sleep(1); + } + + return true; } diff --git a/ECTrainer2/EyeTrack.h b/ECTrainer2/EyeTrack.h index 80679ee..1666a39 100644 --- a/ECTrainer2/EyeTrack.h +++ b/ECTrainer2/EyeTrack.h @@ -1,9 +1,19 @@ #pragma once #include "BaseProcess.h" +#include "myOpenCV.h" + +class Marker; class EyeTrack : public BaseProcess { + Marker* _pMarker; + cv::Point _GazeV; // ����摜���̒����_���W + cv::Point2f _GazeI; // �h���摜���̒����_���W�i���K�����W�n�j public: - EyeTrack(ECTrainer* pEct); + EyeTrack(ECTrainer* pEct, Marker* pMarker); + bool MainLoop(); + void SetGazeV(cv::Point gazeV) { _GazeV = gazeV; } + cv::Point GetGazeV() { return _GazeV; } + cv::Point2f GetGazeI() { return _GazeI; } }; diff --git a/ECTrainer2/Marker.cpp b/ECTrainer2/Marker.cpp index 8982c65..950d8b0 100644 --- a/ECTrainer2/Marker.cpp +++ b/ECTrainer2/Marker.cpp @@ -71,8 +71,10 @@ // �Ή��_�̗� std::vector cornerW, cornerC; for (int i = 0; i < corners.size(); i++) { - cornerC.push_back(corners[i][0]); - cornerW.push_back(_Corners[mids[i] - 1][0]); + for (int j = 0; j < corners[i].size(); j++) { + cornerC.push_back(corners[i][j]); + cornerW.push_back(_Corners[mids[i] - 1][j]); + } } if (cornerC.size() < 4) return false; @@ -80,3 +82,15 @@ _Homography = findHomography(cornerC, cornerW); return !_Homography.empty(); } + +// ���W�ϊ��i����摜���W�����K���h���摜���W�j +cv::Point2f Marker::ConvV2I(cv::Point gazeV) { + if (_Homography.empty()) return cv::Point2f(-1.F, -1.F); + cv::Mat gazeVe = (cv::Mat_(3, 1) << gazeV.x, gazeV.y, 1); + cv::Mat gazeIe = _Homography * gazeVe; + double* pgazeIe = gazeIe.ptr(0); + float x = (float)(*pgazeIe / *(pgazeIe + 2)); + float y = (float)(*(pgazeIe + 1) / *(pgazeIe + 2)); + if (x < 0 || x > 1.F || y < 0 || y > 1.F) return cv::Point2f(-1.F, -1.F); + return cv::Point2f(x, y); +} diff --git a/ECTrainer2/Marker.h b/ECTrainer2/Marker.h index f2af4f7..c8cc505 100644 --- a/ECTrainer2/Marker.h +++ b/ECTrainer2/Marker.h @@ -19,4 +19,5 @@ void Generate(cv::Size imgsize); void DrawMarker(cv::Mat& img); bool Detect(cv::Mat& img); + cv::Point2f ConvV2I(cv::Point gazeV); };