diff --git a/ECTrainer2/Marker.cpp b/ECTrainer2/Marker.cpp index be1343c..63d3986 100644 --- a/ECTrainer2/Marker.cpp +++ b/ECTrainer2/Marker.cpp @@ -6,34 +6,33 @@ #endif // �R���X�g���N�^ -Marker::Marker() : _Size(0) +Marker::Marker() { _Dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_4X4_50); + Generate(IMGSIZE); } // �}�[�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.0F - 2.0F * MARGIN.x - width) / 2.0F; - float itvY = (1.0F - 2.0F * MARGIN.y - HEIGHT) / 2.0F; + //_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 _Corners.clear(); - for (int iy = 0; iy < 3; iy++) { - for (int ix = 0; ix < 3; ix++) { - if (ix == 1 && iy == 1) continue; // ���S�ɂ̓}�[�J�[��u���Ȃ� - - std::vector marker; - marker.push_back(cv::Point2f( - MARGIN.x + itvX * ix, MARGIN.y + itvY * iy)); - marker.push_back(cv::Point2f( - MARGIN.x + itvX * ix + width, MARGIN.y + itvY * iy)); - marker.push_back(cv::Point2f( - MARGIN.x + itvX * ix + width, MARGIN.y + itvY * iy + HEIGHT)); - marker.push_back(cv::Point2f( - MARGIN.x + itvX * ix, MARGIN.y + itvY * iy + HEIGHT)); - _Corners.push_back(marker); + for (int ix = 0; ix < 2; ix++) { + for (int iy = 0; iy < 4; iy++) { + std::vector vertex; + vertex.push_back(cv::Point2f( + (float)(MARGIN.x + itvX * ix), (float)(MARGIN.y + itvY * iy))); + vertex.push_back(cv::Point2f( + (float)(MARGIN.x + itvX * ix + SIZE.x), (float)(MARGIN.y + itvY * iy))); + vertex.push_back(cv::Point2f( + (float)(MARGIN.x + itvX * ix + SIZE.x), (float)(MARGIN.y + itvY * iy + SIZE.y))); + vertex.push_back(cv::Point2f( + (float)(MARGIN.x + itvX * ix), (float)(MARGIN.y + itvY * iy + SIZE.y))); + _Corners.push_back(vertex); //printf("marker %d : (%f,%f) (%f,%f) (%f,%f) (%f,%f)\n", // (int)_Corners.size(), marker[0].x, marker[0].y // , marker[1].x, marker[1].y @@ -45,7 +44,7 @@ // �}�[�J�[��`�悷�� void Marker::DrawMarker(cv::Mat& img) { - if (_Size < 1) { + if (_Corners.size() < 1) { #ifdef _DEBUG std::cout << "Marker isn't generated." << std::endl; #endif @@ -55,12 +54,12 @@ cv::Mat marker; int outMargin = (int)(img.rows * OUTER_MARGIN); for (int i = 0; i < _Corners.size(); i++) { - cv::aruco::drawMarker(_Dictionary, i + 1, _Size, marker, 1); + cv::aruco::drawMarker(_Dictionary, i + 1, SIZE.x, marker, 1); cv::cvtColor(marker, marker, cv::COLOR_GRAY2BGR); cv::Point p = cv::Point((int)(_Corners[i][0].x * img.cols), (int)(_Corners[i][0].y * img.rows)); - cv::Mat roi2(img, cv::Rect(p.x - outMargin, p.y - outMargin, _Size + outMargin * 2, _Size + outMargin * 2)); + cv::Mat roi2(img, cv::Rect(p.x - outMargin, p.y - outMargin, SIZE.x + outMargin * 2, SIZE.y + outMargin * 2)); roi2 = cv::Scalar(255, 255, 255); - cv::Mat roi(img, cv::Rect(p, cv::Size(_Size, _Size))); + cv::Mat roi(img, cv::Rect(p, cv::Size(SIZE))); marker.copyTo(roi); } } @@ -68,19 +67,19 @@ // �}�[�J�[�̌��o bool Marker::Detect(cv::Mat& img) { // �}�[�J�[�̌��o - std::vector mids; + std::vector markerIds; std::vector> corners; cv::Ptr parameters = cv::aruco::DetectorParameters::create(); - cv::aruco::detectMarkers(img, _Dictionary, corners, mids, parameters); - cv::aruco::drawDetectedMarkers(img, corners, mids); + 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 (mids[i]-1 < _Corners.size()) { + 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[mids[i] - 1][j]); + cornerW.push_back(_Corners[markerIds[i] - 1][j]); } } //printf("(%f,%f) ", corners[i][0].x, corners[i][0].y); @@ -89,19 +88,21 @@ if (cornerC.size() < 4) return false; // �z���O���t�B�s��̎Z�o - _Homography = findHomography(cornerC, cornerW); - return !_Homography.empty(); + _HomographyV2I = findHomography(cornerC, cornerW); + _HomographyI2V = findHomography(cornerW, cornerC); + return !(_HomographyV2I.empty() || _HomographyI2V.empty()); } -// ���W�ϊ��i����摜���W�����K���h���摜���W�j +// ���W�ϊ��i����摜���W���摜���W�j cv::Point2f Marker::ConvV2I(cv::Point gazeV) { - if (_Homography.empty()) return cv::Point2f(-1.F, -1.F); + 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 = _Homography * gazeVe; + 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 > 1.F || y < 0 || y > 1.F) return cv::Point2f(-1.F, -1.F); + if (x < 0 || x >= (float)IMGSIZE.width || y < 0 || y >= IMGSIZE.height) + return cv::Point2f(-1.F, -1.F); return cv::Point2f(x, y); } diff --git a/ECTrainer2/Marker.h b/ECTrainer2/Marker.h index 5202645..3338a23 100644 --- a/ECTrainer2/Marker.h +++ b/ECTrainer2/Marker.h @@ -5,14 +5,16 @@ class Marker { - const cv::Point2f MARGIN = cv::Size2f(0.03F, 0.03F); - const float OUTER_MARGIN = 0.01F; - const float HEIGHT = 0.1F; + 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 float OUTER_MARGIN = 0.01F; // �}�[�J�[�`��p std::vector> _Corners; cv::Ptr _Dictionary; - int _Size; - cv::Mat _Homography; + //int _Size; + cv::Mat _HomographyV2I; + cv::Mat _HomographyI2V; public: Marker();