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