diff --git a/ECTrainer2/ECTrainer.cpp b/ECTrainer2/ECTrainer.cpp index f7b1c43..9489332 100644 --- a/ECTrainer2/ECTrainer.cpp +++ b/ECTrainer2/ECTrainer.cpp @@ -13,13 +13,13 @@ // �R���X�g���N�^ ECTrainer::ECTrainer(HINSTANCE hInstance) : _AppRunning(true) - , _HomographyOK(false) + //, _HomographyOK(false) , _CalibResult(0) , _hInstance(hInstance) { _pMarker = new Marker(); _pProcs[GUI] = new ECTrainerGUI(this); - _pProcs[IMGPROC] = new ImageProc(this, _pMarker); + _pProcs[IMGPROC] = new ImageProc(this); _pProcs[SCNCAM] = new SceneCamera(this); _pProcs[STIM] = new Stimulus(this, _pMarker); _pProcs[EYETR] = new EyeTrack(this, _pMarker); @@ -98,10 +98,10 @@ ((Stimulus*)_pProcs[STIM])->SetPage(Stimulus::PAGES::NEXT); } -// ����摜�o�b�t�@�ɉ摜��ݒ� -void ECTrainer::SetSceneBuffer(cv::Mat& img) { - ((ECTrainerGUI*)_pProcs[GUI])->SetSceneBuffer(img); -} +//// ����摜�o�b�t�@�ɉ摜��ݒ� +//void ECTrainer::SetSceneBuffer(cv::Mat& img) { +// ((ECTrainerGUI*)_pProcs[GUI])->SetSceneBuffer(img); +//} // �h���摜�o�b�t�@�ɉ摜��ݒ� void ECTrainer::SetDispBuffer(cv::Mat& img) { diff --git a/ECTrainer2/ECTrainer.h b/ECTrainer2/ECTrainer.h index f70df5d..b233889 100644 --- a/ECTrainer2/ECTrainer.h +++ b/ECTrainer2/ECTrainer.h @@ -24,9 +24,9 @@ HINSTANCE _hInstance; Marker* _pMarker; bool _AppRunning; // ���s���t���O - bool _HomographyOK; // �ϊ��s��̊l���L�� + //bool _HomographyOK; // �ϊ��s��̊l���L�� int _CalibResult; // �L�����u���[�V�������� 0:�����{ 1:���� -1:���s - cv::Size _SceneSize; // ���E�J�����̉摜�T�C�Y + //cv::Size _SceneSize; // ���E�J�����̉摜�T�C�Y std::wstring _MovieToShow; // �Đ����铮��t�@�C�� // �X���b�h�J�n�_ @@ -52,7 +52,7 @@ void StartStim(); void StopStim(); void NextStim(); - void SetSceneBuffer(cv::Mat& img); + //void SetSceneBuffer(cv::Mat& img); void SetDispBuffer(cv::Mat& img); void SetGazeV(cv::Point gazeV); int BatteryLevel(); @@ -64,10 +64,10 @@ // �C�����C���֐� bool IsAppRun() { return _AppRunning; } // �A�v���P�[�V�������s�����ǂ��� void StopApp() { _AppRunning = false; } // �A�v���P�[�V�������~ - void SetHomographyStatus(bool ok) { _HomographyOK = ok; } - bool GetHomographyStatus() { return _HomographyOK; } - void SetSceneSize(cv::Size s) { _SceneSize = s; } - cv::Size GetSceneSize() { return _SceneSize; } + //void SetHomographyStatus(bool ok) { _HomographyOK = ok; } + //bool GetHomographyStatus() { return _HomographyOK; } + //void SetSceneSize(cv::Size s) { _SceneSize = s; } + //cv::Size GetSceneSize() { return _SceneSize; } void SetCalibResult(int result) { _CalibResult = result; } void SetMovieToShow(std::wstring file) { _MovieToShow = file; } std::wstring GetMovieToShow() { return _MovieToShow; } diff --git a/ECTrainer2/ECTrainer2.vcxproj b/ECTrainer2/ECTrainer2.vcxproj index 4add593..60f43b2 100644 --- a/ECTrainer2/ECTrainer2.vcxproj +++ b/ECTrainer2/ECTrainer2.vcxproj @@ -168,6 +168,7 @@ + diff --git a/ECTrainer2/ECTrainer2.vcxproj.filters b/ECTrainer2/ECTrainer2.vcxproj.filters index 810db5f..def3c08 100644 --- a/ECTrainer2/ECTrainer2.vcxproj.filters +++ b/ECTrainer2/ECTrainer2.vcxproj.filters @@ -113,6 +113,9 @@ ヘッダー ファイル + + ヘッダー ファイル + diff --git a/ECTrainer2/ECTrainerGUI.cpp b/ECTrainer2/ECTrainerGUI.cpp index 2e0189f..cbd5241 100644 --- a/ECTrainer2/ECTrainerGUI.cpp +++ b/ECTrainer2/ECTrainerGUI.cpp @@ -2,6 +2,10 @@ #include "ECTrainerGUI.h" #include "ECTrainer.h" #include "BitalMonitor.h" +#include "ImageProc.h" +#include "Marker.h" +//#include "MyWinUtils.h" +#include "myOpenCVutil.h" #include #pragma comment(lib,"winmm.lib") #include @@ -91,9 +95,9 @@ cv::moveWindow(WIN_MAIN, _Displays[0].left + 100, _Displays[0].top + 100); _DispRect = _Displays[0]; } - cv::Mat blank(cv::Size(IMAGE_WIDTH, 480), CV_8UC3, cv::Scalar(0)); - blank.copyTo(_SceneBuffer); - blank.copyTo(_DispImage); + _blank = cv::Mat(DISP_SIZE, CV_8UC3, cv::Scalar(0)); + //blank.copyTo(_SceneBuffer); + _blank.copyTo(_DispImage); _Logo = cv::imread("../images/ECTLogo2_1480l.png"); return InitDx(hInstance); @@ -171,13 +175,14 @@ } // �\���o�b�t�@���� + cv::Mat sceneBuf = _pEct->PImageProc()->GetImage(); + if (sceneBuf.empty()) sceneBuf = _blank; + cv::Mat CurDisplay = _DispImage.clone(); // �����_�̕\�� if (_pEct->GetGazeV().x >= 0) { - cv::circle(_SceneBuffer, - cv::Point((int)(_pEct->GetGazeV().x * _SceneBufferScale), - (int)(_pEct->GetGazeV().y * _SceneBufferScale)), 10, CV_RGB(0, 0, 255), 2); + cv::circle(sceneBuf, _pEct->GetGazeV(), 10, CV_RGB(0, 0, 255), 2); } if (_pEct->GetGazeI().x >= 0) { cv::circle(CurDisplay, cv::Point((int)_pEct->GetGazeI().x/2, @@ -286,7 +291,7 @@ cvui::printf("Mouse L %.2f, %.2f", imagePos.x, imagePos.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"); + cvui::text(_pEct->PMarker()->IsDetected() ? "AR Markers OK" : "AR Markers NG"); cvui::printf("Battery %d %%", _pEct->BatteryLevel()); if (IsPlaying()) { REFTIME tm; @@ -299,7 +304,10 @@ cvui::text(cv::format("%3d", _pEct->PBitalMonitor()->GetHB()), 2.0); cvui::endColumn(); cvui::text(_MainFrame, SCENE_BUFFER_POS.x, 100, "SCENE CAMERA"); - cvui::image(_MainFrame, SCENE_BUFFER_POS.x, SCENE_BUFFER_POS.y, _SceneBuffer); + //cv::Mat sceneDisp; + //cv::resize(sceneBuf, sceneDisp, DISP_SIZE); + cv::Mat resized = KeepAspectResize(sceneBuf, DISP_SIZE.width); + cvui::image(_MainFrame, SCENE_BUFFER_POS.x, SCENE_BUFFER_POS.y, resized); cvui::text(_MainFrame, DISP_IMAGE_POS.x, 100, "STIMULUS IMAGE"); cv::Mat disp; cv::resize(CurDisplay, disp, cv::Size(IMAGE_WIDTH, _DispImageHeight)); @@ -447,11 +455,11 @@ } // ����摜�o�b�t�@�ɉ摜��ݒ� -void ECTrainerGUI::SetSceneBuffer(cv::Mat& img) { - _SceneBufferScale = (float)IMAGE_WIDTH / img.cols; - _SceneBufferHeight = (int)(img.rows * _SceneBufferScale); - cv::resize(img, _SceneBuffer, cv::Size(IMAGE_WIDTH, _SceneBufferHeight)); -} +//void ECTrainerGUI::SetSceneBuffer(cv::Mat& img) { +// _SceneBufferScale = (float)IMAGE_WIDTH / img.cols; +// _SceneBufferHeight = (int)(img.rows * _SceneBufferScale); +// cv::resize(img, _SceneBuffer, cv::Size(IMAGE_WIDTH, _SceneBufferHeight)); +//} // �h���摜�o�b�t�@�ɉ摜��ݒ� void ECTrainerGUI::SetDispBuffer(cv::Mat& img) { diff --git a/ECTrainer2/ECTrainerGUI.h b/ECTrainer2/ECTrainerGUI.h index 2a424e9..a40140b 100644 --- a/ECTrainer2/ECTrainerGUI.h +++ b/ECTrainer2/ECTrainerGUI.h @@ -21,6 +21,7 @@ const cv::String WIN_MAIN = "Eye Contact Trainer"; const cv::Size MAIN_FRAME_SIZE = cv::Size(1480, 620); const int IMAGE_WIDTH = 640; + const cv::Size DISP_SIZE = cv::Size(640, 480); 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; @@ -30,8 +31,9 @@ cv::Mat _MainFrame; // ���C���E�C���h�E�t���[�� cv::Mat _DispImage; // �h���摜 cv::Mat _DispBuffer; // �h����� - cv::Mat _SceneBuffer; // ����摜 + //cv::Mat _SceneBuffer; // ����摜 cv::Mat _Logo; // ���S + cv::Mat _blank; // �u�����N int _SceneBufferHeight; float _SceneBufferScale; int _DispImageHeight; @@ -61,6 +63,6 @@ ~ECTrainerGUI(); bool Init(HINSTANCE hInstance); bool MainLoop(); - void SetSceneBuffer(cv::Mat &img); + //void SetSceneBuffer(cv::Mat &img); void SetDispBuffer(cv::Mat& img); }; diff --git a/ECTrainer2/EyeTrack.cpp b/ECTrainer2/EyeTrack.cpp index 4a0b598..31b0877 100644 --- a/ECTrainer2/EyeTrack.cpp +++ b/ECTrainer2/EyeTrack.cpp @@ -3,6 +3,7 @@ #include #include "EyeTrack.h" #include "ECTrainer.h" +#include "SceneCamera.h" #include "Marker.h" #include "MeanBuffer.h" #pragma comment(lib, "ws2_32.lib") @@ -52,7 +53,7 @@ char buf[BUFLEN]; int lastGidx = 0; cv::Point2f gp; - cv::Size sceneSize = _pEct->GetSceneSize(); + cv::Size sceneSize = _pEct->PSceneCamera()->GetSize(); std::cout << "sceneSize: " << sceneSize.width << "," << sceneSize.height << std::endl; MeanBuffer gpCx(DATA_MEAN_SIZE), gpCy(DATA_MEAN_SIZE); //std::ofstream ofs; diff --git a/ECTrainer2/ImageProc.cpp b/ECTrainer2/ImageProc.cpp index 80bf468..cc8a8c6 100644 --- a/ECTrainer2/ImageProc.cpp +++ b/ECTrainer2/ImageProc.cpp @@ -1,31 +1,25 @@ #include "ECTrainer.h" #include "ImageProc.h" +#include "SceneCamera.h" #include "Marker.h" // �R���X�g���N�^ -ImageProc::ImageProc(ECTrainer* pEct, Marker* pMarker) - :BaseProcess(pEct), _pMarker(pMarker), _Write(0), _Read(1) { +ImageProc::ImageProc(ECTrainer* pEct) + : BaseProcess(pEct) + , _OutputBuf(ECTrainer::RINGBUFSIZE) { } // ���[�v bool ImageProc::MainLoop() { - int lastRead = _Read; while (_pEct->IsAppRun()) { - while (_Read == lastRead && _pEct->IsAppRun()) Sleep(1); - cv::Mat img = _Frames[_Read].clone(); - lastRead = _Read; - bool hOK = _pMarker->Detect(img); - _pEct->SetHomographyStatus(hOK); - _pEct->SetSceneBuffer(img); + Sleep(0); + if (!_pEct->PSceneCamera()->IsNew()) continue; + cv::Mat img = _pEct->PSceneCamera()->GetImage().clone(); + _pEct->PMarker()->Detect(img); + //_pEct->SetHomographyStatus(hOK); + _OutputBuf.Put(img); } return true; } - -// �摜��M -void ImageProc::SetImage(cv::Mat& img) { - img.copyTo(_Frames[_Write]); - _Read = _Write; - _Write = (_Write + 1) % FRAMES; -} diff --git a/ECTrainer2/ImageProc.h b/ECTrainer2/ImageProc.h index dd16e0d..a47f406 100644 --- a/ECTrainer2/ImageProc.h +++ b/ECTrainer2/ImageProc.h @@ -2,20 +2,17 @@ #include "myOpenCV.h" #include "BaseProcess.h" +#include "RingBuffer.h" class Marker; class ImageProc : public BaseProcess { - static const int FRAMES = 2; - - Marker* _pMarker; - cv::Mat _Frames[FRAMES]; - int _Write; - int _Read; + RingBuffer _OutputBuf; public: - ImageProc(ECTrainer* pEct, Marker* pMarker); + ImageProc(ECTrainer* pEct); bool MainLoop(); - void SetImage(cv::Mat& img); + // �o�̓o�b�t�@������o�� + cv::Mat GetImage() { return _OutputBuf.Get(); } }; diff --git a/ECTrainer2/Marker.cpp b/ECTrainer2/Marker.cpp index 63d3986..ecb7518 100644 --- a/ECTrainer2/Marker.cpp +++ b/ECTrainer2/Marker.cpp @@ -1,5 +1,6 @@ #include "Marker.h" +#include "ECTrainer.h" #ifdef _DEBUG #include @@ -7,16 +8,16 @@ // �R���X�g���N�^ Marker::Marker() + : _detected(false) + , _HomographyV2I(ECTrainer::RINGBUFSIZE) { _Dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_4X4_50); - Generate(IMGSIZE); + CalcMarkerCorners(IMGSIZE); } // �}�[�J�[���W�̌v�Z -void Marker::Generate(cv::Size imgsize) { +void Marker::CalcMarkerCorners(cv::Size imgsize) { // �萔�̌v�Z - //_Size = (int)(imgsize.height * HEIGHT); - //float width = HEIGHT; int itvX = imgsize.width - (SIZE.x + MARGIN.x * 2); int itvY = (imgsize.height - (SIZE.x + MARGIN.x * 2)) / 3; // ���W�v�Z @@ -42,6 +43,58 @@ } } +// �}�[�J�[�̌��o +void Marker::Detect(cv::Mat& img) { + // �}�[�J�[�̌��o + std::vector markerIds; + std::vector> corners; + cv::Ptr parameters = cv::aruco::DetectorParameters::create(); + cv::aruco::detectMarkers(img, _Dictionary, corners, markerIds, parameters); + cv::aruco::drawDetectedMarkers(img, corners, markerIds); + + // �Ή��_�̗� + std::vector cornerI, cornerV; + for (int i = 0; i < corners.size(); i++) { + if (markerIds[i] - 1 < _Corners.size()) { + for (int j = 0; j < corners[i].size(); j++) { + cornerV.push_back(corners[i][j]); + cornerI.push_back(_Corners[markerIds[i] - 1][j]); + } + } + } + if (cornerV.size() < 4) { + _detected = false; + return; + } + + // �z���O���t�B�s��̎Z�o + cv::Mat h = findHomography(cornerV, cornerI); + if (h.empty()) { + _detected = false; + } else { + _HomographyV2I.Put(h); + _detected = true; + } +} + +// ���W�ϊ��i����摜���W���摜���W�j +cv::Point2f Marker::ConvV2I(cv::Point gazeV) { + cv::Mat h = _HomographyV2I.Get(); + if (h.empty()) return cv::Point2f(-1.F, -1.F); + + cv::Mat gazeVe = (cv::Mat_(3, 1) << gazeV.x, gazeV.y, 1); + cv::Mat gazeIe = h * gazeVe; + + double* pgazeIe = gazeIe.ptr(0); + float x = (float)(*pgazeIe / *(pgazeIe + 2)); + float y = (float)(*(pgazeIe + 1) / *(pgazeIe + 2)); + //std::cout << x << "," << y << std::endl; + if (x < 0 || x >= (float)IMGSIZE.width || y < 0 || y >= IMGSIZE.height) + return cv::Point2f(-1.F, -1.F); + return cv::Point2f(x, y); +} + +#if 0 // �}�[�J�[��`�悷�� void Marker::DrawMarker(cv::Mat& img) { if (_Corners.size() < 1) { @@ -63,46 +116,4 @@ marker.copyTo(roi); } } - -// �}�[�J�[�̌��o -bool Marker::Detect(cv::Mat& img) { - // �}�[�J�[�̌��o - std::vector markerIds; - std::vector> corners; - cv::Ptr parameters = cv::aruco::DetectorParameters::create(); - cv::aruco::detectMarkers(img, _Dictionary, corners, markerIds, parameters); - cv::aruco::drawDetectedMarkers(img, corners, markerIds); - - // �Ή��_�̗� - std::vector cornerW, cornerC; - for (int i = 0; i < corners.size(); i++) { - if (markerIds[i] - 1 < _Corners.size()) { - for (int j = 0; j < corners[i].size(); j++) { - cornerC.push_back(corners[i][j]); - cornerW.push_back(_Corners[markerIds[i] - 1][j]); - } - } - //printf("(%f,%f) ", corners[i][0].x, corners[i][0].y); - } - //if (corners.size() > 0) printf("\n"); - if (cornerC.size() < 4) return false; - - // �z���O���t�B�s��̎Z�o - _HomographyV2I = findHomography(cornerC, cornerW); - _HomographyI2V = findHomography(cornerW, cornerC); - return !(_HomographyV2I.empty() || _HomographyI2V.empty()); -} - -// ���W�ϊ��i����摜���W���摜���W�j -cv::Point2f Marker::ConvV2I(cv::Point gazeV) { - if (_HomographyV2I.empty()) return cv::Point2f(-1.F, -1.F); - cv::Mat gazeVe = (cv::Mat_(3, 1) << gazeV.x, gazeV.y, 1); - cv::Mat gazeIe = _HomographyV2I * gazeVe; - double* pgazeIe = gazeIe.ptr(0); - float x = (float)(*pgazeIe / *(pgazeIe + 2)); - float y = (float)(*(pgazeIe + 1) / *(pgazeIe + 2)); - //std::cout << x << "," << y << std::endl; - if (x < 0 || x >= (float)IMGSIZE.width || y < 0 || y >= IMGSIZE.height) - return cv::Point2f(-1.F, -1.F); - return cv::Point2f(x, y); -} +#endif diff --git a/ECTrainer2/Marker.h b/ECTrainer2/Marker.h index 3338a23..ff5fa8b 100644 --- a/ECTrainer2/Marker.h +++ b/ECTrainer2/Marker.h @@ -1,25 +1,35 @@ #pragma once #include "myOpenCV.h" +#include "RingBuffer.h" #include class Marker { - const cv::Size IMGSIZE= cv::Size(1920, 1080); // �摜�T�C�Y - const cv::Point MARGIN = cv::Point(10, 10); - const cv::Point SIZE = cv::Point(100, 100); + const cv::Size IMGSIZE= cv::Size(1920, 1080); // �񎦉摜�T�C�Y + const cv::Point SIZE = cv::Point(100, 100); // AR�}�[�J�[�̃T�C�Y + const cv::Point MARGIN = cv::Point(10, 10); // AR�}�[�J�[���͘g�̕� const float OUTER_MARGIN = 0.01F; // �}�[�J�[�`��p - std::vector> _Corners; - cv::Ptr _Dictionary; - //int _Size; - cv::Mat _HomographyV2I; - cv::Mat _HomographyI2V; + std::vector> _Corners; // �}�[�J�[���_���W�i�񎦉摜���W�j + cv::Ptr _Dictionary; // AR�}�[�J�[�����Z�b�g + bool _detected; // �}�[�J�[���o�”ۏ�� + RingBuffer _HomographyV2I; // �ϊ��s�� ����摜���񎦉摜 + + // �}�[�J�[���_�̐��� + void CalcMarkerCorners(cv::Size imgsize); public: + // �R���X�g���N�^ Marker(); - void Generate(cv::Size imgsize); - void DrawMarker(cv::Mat& img); - bool Detect(cv::Mat& img); + // �}�[�J�[���o + void Detect(cv::Mat& img); + // �}�[�J�[���o��Ԃ��擾 + bool IsDetected() { return _detected; } + // ���W�ϊ��i����摜���W���摜���W�j cv::Point2f ConvV2I(cv::Point gazeV); + // �ϊ��s����擾 + cv::Mat GetHomography() { return _HomographyV2I.Get(); } + + //void DrawMarker(cv::Mat& img); // �摜�Ƀ}�[�J�[��`�� }; diff --git a/ECTrainer2/SceneCamera.cpp b/ECTrainer2/SceneCamera.cpp index 5c1f4e1..62b71bc 100644 --- a/ECTrainer2/SceneCamera.cpp +++ b/ECTrainer2/SceneCamera.cpp @@ -4,11 +4,11 @@ #include "ECTrainer.h" #include "SceneCamera.h" -#include "ImageProc.h" // �R���X�g���N�^ -SceneCamera::SceneCamera(ECTrainer* pEct) : BaseProcess(pEct) { - +SceneCamera::SceneCamera(ECTrainer* pEct) + : BaseProcess(pEct) + , _buffer(ECTrainer::RINGBUFSIZE) { } // ������ @@ -23,7 +23,7 @@ // �摜�T�C�Y��ۑ� cv::Mat scene; _SceneCam >> scene; - _pEct->SetSceneSize(scene.size()); + _sceneSize = scene.size(); return true; } @@ -34,8 +34,8 @@ // �V�[���B�e cv::Mat scene; _SceneCam >> scene; - _pEct->PImageProc()->SetImage(scene); - //Sleep(0); + _buffer.Put(scene); + Sleep(0); } return true; diff --git a/ECTrainer2/SceneCamera.h b/ECTrainer2/SceneCamera.h index 5db213b..1b9c40b 100644 --- a/ECTrainer2/SceneCamera.h +++ b/ECTrainer2/SceneCamera.h @@ -2,15 +2,21 @@ #include "myOpenCV.h" #include "BaseProcess.h" +#include "RingBuffer.h" class ImageProc; class SceneCamera : public BaseProcess { cv::VideoCapture _SceneCam; + RingBuffer _buffer; + cv::Size _sceneSize; public: SceneCamera(ECTrainer* pEct); bool Init(); bool MainLoop(); + cv::Size GetSize() { return _sceneSize; } + cv::Mat GetImage() { return _buffer.Get(); } + bool IsNew() { return _buffer.IsNew(); } }; diff --git a/ECTrainer2/Stimulus.cpp b/ECTrainer2/Stimulus.cpp index 253a934..3394576 100644 --- a/ECTrainer2/Stimulus.cpp +++ b/ECTrainer2/Stimulus.cpp @@ -2,11 +2,9 @@ #include "Stimulus.h" #include "ECTrainer.h" #include "Marker.h" +#include "MyWinUtils.h" #include #include -#include -#include -#include "MyWinUtils.h" // �R���X�g���N�^ Stimulus::Stimulus(ECTrainer* pEct, Marker* pMarker) diff --git a/ECTrainer2/Worker.cpp b/ECTrainer2/Worker.cpp index d1225e3..c31e7aa 100644 --- a/ECTrainer2/Worker.cpp +++ b/ECTrainer2/Worker.cpp @@ -18,7 +18,7 @@ int64 start = cv::getTickCount(); FILE* fp; fopen_s(&fp, "log.txt", "w"); - printf("time,gazeVx,gazeVy,RR\n"); + fprintf(fp, "time,gazeVx,gazeVy,RR\n"); while (_pEct->IsAppRun()) { Sleep(0); @@ -29,6 +29,7 @@ cv::Point2f gazeV = (_pEct->GetGazeV()); fprintf(fp, ",%.1f,%.1f", gazeV.x, gazeV.y); fprintf(fp, ",%d", _pEct->PBitalMonitor()->GetRR()); + fprintf(fp, "\n"); } fclose(fp); diff --git a/ECTrainer2/myOpenCVutil.h b/ECTrainer2/myOpenCVutil.h new file mode 100644 index 0000000..d36185b --- /dev/null +++ b/ECTrainer2/myOpenCVutil.h @@ -0,0 +1,69 @@ + +// OpenCV 3�n, 4�n ���[�e�B���e�B�t�@�C�� +// T.Nakaguchi, CFME, Chiba Univ., 2019 + +#pragma once + +#include "myOpenCV.h" +#include + +// �����摜���c���ɘA���\�� +void imShowMulti( + cv::String winname, std::vector& imgs, // �S�Ă̕\���摜�i8bit 3ch or 8bit 1ch�̂�) + unsigned int cols, // ���̘A���� + unsigned int rows, // �c�̘A���� + cv::Size imgsize, // �\������摜�T�C�Y + unsigned int border) +{ + if (imgs.size() < 1 || cols < 1 || rows < 1) return; + + unsigned int w = imgsize.width + border, h = imgsize.height + border; + cv::Mat board(h * rows + border, w * cols + border, CV_8UC3, CV_RGB(128, 128, 128)); + for (unsigned int r = 0, i = 0; r < rows; r ++) { + for(unsigned int c = 0; c < cols; c ++, i ++) { + cv::Rect roi_rect = cv::Rect(c * w + border, r * h + border, imgsize.width, imgsize.height); + cv::Mat roi(board, roi_rect); + if (i < imgs.size()) { + if (imgs[i].type() == CV_8UC3) { + resize(imgs[i], roi, imgsize); + } else if (imgs[i].type() == CV_8UC1) { + cv::Mat c3; + cvtColor(imgs[i], c3, cv::COLOR_GRAY2BGR); + resize(c3, roi, imgsize); + } else { + putText(roi, "Color mode not matched", cv::Point(20,20), cv::FONT_HERSHEY_COMPLEX, 0.5, CV_RGB(0,0,0)); + } + } else { + putText(roi, "No image", cv::Point(20,20), cv::FONT_HERSHEY_COMPLEX, 0.5, CV_RGB(0,0,0)); + } + } + } + imshow(winname, board); +} + +// �c�����ۂ������T�C�Y +cv::Mat KeepAspectResize(cv::Mat& img, int width = 0, int height = 0) { + cv::Size outputSize; + if (width > 0) { + if (height > 0) { + // �c���w��i���T�C�Y�Ɏ��܂�悤�ɂ���j + outputSize = cv::Size(height * img.cols / img.rows, width * img.rows / img.cols); + if (outputSize.width > width) outputSize.width = width; + else outputSize.height = height; + } else { + // �����w�� + outputSize = cv::Size(width, width * img.rows / img.cols); + } + } else { + if (height > 0) { + // �c���w�� + outputSize = cv::Size(height * img.cols / img.rows, height); + } else { + // �c���ǂ�����w�薳���ꍇ�͓��͂̃R�s�[��Ԃ� + return img.clone(); + } + } + cv::Mat resized; + cv::resize(img, resized, outputSize); + return resized; +} diff --git "a/\343\203\241\343\203\203\343\202\273\343\203\274\343\202\270\345\233\263.xlsx" "b/\343\203\241\343\203\203\343\202\273\343\203\274\343\202\270\345\233\263.xlsx" index 6d212e7..6f88b4a 100644 --- "a/\343\203\241\343\203\203\343\202\273\343\203\274\343\202\270\345\233\263.xlsx" +++ "b/\343\203\241\343\203\203\343\202\273\343\203\274\343\202\270\345\233\263.xlsx" Binary files differ