diff --git a/ECTrainer2/ECTrainer.cpp b/ECTrainer2/ECTrainer.cpp index 5c16551..b2676f6 100644 --- a/ECTrainer2/ECTrainer.cpp +++ b/ECTrainer2/ECTrainer.cpp @@ -3,6 +3,7 @@ #include "ECTrainerGUI.h" #include "SceneCamera.h" #include "Stimulus.h" +#include "Marker.h" #ifdef _DEBUG #include @@ -13,11 +14,13 @@ : _pGui(NULL) , _pSceneCam(NULL) , _pStimulus(NULL) + , _pMarker(NULL) , _Running(true) { + _pMarker = new Marker(); _pGui = new ECTrainerGUI(this); _pSceneCam = new SceneCamera(this); - _pStimulus = new Stimulus(this); + _pStimulus = new Stimulus(this, _pMarker); } // �f�X�g���N�^ @@ -25,28 +28,29 @@ if (_pGui) delete _pGui; if (_pSceneCam) delete _pSceneCam; if (_pStimulus) delete _pStimulus; + if (_pMarker) delete _pMarker; } // ������ bool ECTrainer::Process() { if (!_pGui->Init()) return false; - if (!_pSceneCam->Init()) return false; + //if (!_pSceneCam->Init()) return false; if (!_pStimulus->Init()) return false; DWORD dwThreadIdSceneCam, dwThreadIdStimulus; - HANDLE hThreadSceneCam = CreateThread(NULL, 0, SceneCamThreadEntry, this, 0, &dwThreadIdSceneCam); + //HANDLE hThreadSceneCam = CreateThread(NULL, 0, SceneCamThreadEntry, this, 0, &dwThreadIdSceneCam); HANDLE hThreadStimulus = CreateThread(NULL, 0, StimulusThreadEntry, this, 0, &dwThreadIdStimulus); _pGui->MainLoop(); - HANDLE handles[] = { hThreadSceneCam , hThreadStimulus }; - DWORD timeOut = 1000; // �^�C���A�E�g(ms) - if (WaitForMultipleObjects(sizeof(handles) / sizeof(HANDLE), handles, TRUE, timeOut) != WAIT_TIMEOUT) { -#ifdef _DEBUG - std::cout << "All threads properly ended." << std::endl; -#endif - } - CloseHandle(hThreadSceneCam); + //HANDLE handles[] = { hThreadSceneCam , hThreadStimulus }; +// DWORD timeOut = 1000; // �^�C���A�E�g(ms) +// if (WaitForMultipleObjects(sizeof(handles) / sizeof(HANDLE), handles, TRUE, timeOut) != WAIT_TIMEOUT) { +//#ifdef _DEBUG +// std::cout << "All threads properly ended." << std::endl; +//#endif +// } + //CloseHandle(hThreadSceneCam); CloseHandle(hThreadStimulus); return true; diff --git a/ECTrainer2/ECTrainer.h b/ECTrainer2/ECTrainer.h index fe83516..d264532 100644 --- a/ECTrainer2/ECTrainer.h +++ b/ECTrainer2/ECTrainer.h @@ -6,6 +6,7 @@ class ECTrainerGUI; class SceneCamera; class Stimulus; +class Marker; class ECTrainer { @@ -13,6 +14,7 @@ ECTrainerGUI* _pGui; SceneCamera* _pSceneCam; Stimulus* _pStimulus; + Marker* _pMarker; bool _Running; // �X���b�h�J�n�_ static DWORD SceneCamThreadEntry(LPVOID lpParameter); diff --git a/ECTrainer2/Marker.cpp b/ECTrainer2/Marker.cpp index ea43524..0212ce7 100644 --- a/ECTrainer2/Marker.cpp +++ b/ECTrainer2/Marker.cpp @@ -1,10 +1,23 @@ + #include "Marker.h" +#ifdef _DEBUG +#include +#endif + +// �R���X�g���N�^ +Marker::Marker() : _Size(0) +{ + _Dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_4X4_50); +} + +// �}�[�J�[���W�̌v�Z void Marker::Generate(cv::Size imgsize) { // �萔�̌v�Z + _Size = (int)(imgsize.height * HEIGHT); float width = imgsize.height * HEIGHT / imgsize.width; - float itvX = (1.0 - 2 * MARGIN.x - width) / 2; - float itvY = (1.0 - 2 * MARGIN.y - HEIGHT) / 2; + float itvX = (1.0F - 2.0F * MARGIN.x - width) / 2.0F; + float itvY = (1.0F - 2.0F * MARGIN.y - HEIGHT) / 2.0F; // ���W�v�Z for (int iy = 0; iy < 3; iy++) { for (int ix = 0; ix < 3; ix++) { @@ -23,3 +36,38 @@ } } } + +// �}�[�J�[��`�悷�� +void Marker::DrawMarker(cv::Mat& img) { + if (_Size < 1) { +#ifdef _DEBUG + std::cout << "Marker isn't generated." << std::endl; +#endif + return; + } + //cv::Mat marker; + //cv::aruco::drawMarker(_Dictionary, 1, _Size, marker); + //cv::Rect r = cv::Rect(10, 10, _Size, _Size); + //cv::Mat roi(img, r); + //marker.copyTo(roi); + //return; + cv::Mat marker; + + + for (int i = 0; i < _Corners.size(); i++) { + cv::aruco::drawMarker(_Dictionary, i, _Size, marker); + cv::cvtColor(marker, marker, cv::COLOR_GRAY2BGR); + //if (i == 0) imshow("marker", marker); + cv::Point p = cv::Point((int)(_Corners[i][0].x * img.cols), (int)(_Corners[i][0].y * img.rows)); + cv::Rect r = cv::Rect(p, cv::Size(_Size, _Size)); + //cv::Rect r = cv::Rect(10, 10, 100, 100); + cv::Mat roi(img, r); + //cv::resize(marker, roi, roi.size()); + //std::cout << roi.size(); + //marker.copyTo() + //roi = marker; + marker.copyTo(roi); + cv::circle(img, p, 10, CV_RGB(0, 0, 255), 2); + cv::rectangle(img, r, CV_RGB(0, 255, 0), 2); + } +} diff --git a/ECTrainer2/Marker.h b/ECTrainer2/Marker.h index c532f22..a1acf6b 100644 --- a/ECTrainer2/Marker.h +++ b/ECTrainer2/Marker.h @@ -5,9 +5,14 @@ class Marker { - std::vector> _Corners; - const cv::Point2f MARGIN = cv::Size2f(0.5, 0.5); + const cv::Point2f MARGIN = cv::Size2f(0.05F, 0.05F); const float HEIGHT = 0.1F; + + std::vector> _Corners; + cv::Ptr _Dictionary; + int _Size; public: + Marker(); void Generate(cv::Size imgsize); + void DrawMarker(cv::Mat& img); }; diff --git a/ECTrainer2/Stimulus.cpp b/ECTrainer2/Stimulus.cpp index 5be6491..83f2d3b 100644 --- a/ECTrainer2/Stimulus.cpp +++ b/ECTrainer2/Stimulus.cpp @@ -2,9 +2,11 @@ #include "Stimulus.h" #include "ECTrainer.h" +#include "Marker.h" // �R���X�g���N�^ -Stimulus::Stimulus(ECTrainer* pEct) :_pEct(pEct) { +Stimulus::Stimulus(ECTrainer* pEct, Marker* pMarker) + :_pEct(pEct), _pMarker(pMarker) { } // ������ @@ -30,8 +32,10 @@ // �h���摜�J�n void Stimulus::StartImage() { - //cv::Mat img = cv::imread("../images/lena.jpg"); - cv::Mat img = cv::imread("../images/face_F_L_E.png"); + cv::Mat img = cv::imread("../images/lena.jpg"); + //cv::Mat img = cv::imread("../images/face_F_L_E.png"); + _pMarker->Generate(img.size()); + _pMarker->DrawMarker(img); _pEct->SetDispBuffer(img); } diff --git a/ECTrainer2/Stimulus.h b/ECTrainer2/Stimulus.h index a61245a..416dc21 100644 --- a/ECTrainer2/Stimulus.h +++ b/ECTrainer2/Stimulus.h @@ -3,15 +3,17 @@ #include "myOpenCV.h" class ECTrainer; +class Marker; class Stimulus { const cv::String CALIB_FILE = "../images/calib.png"; ECTrainer* _pEct; + Marker* _pMarker; public: - Stimulus(ECTrainer* pEct); + Stimulus(ECTrainer* pEct, Marker* pMarker); bool Init(); bool MainLoop(); void AddMarker(cv::Mat& img);