Newer
Older
PrismSoftware / ECTrainer2 / Marker.cpp

#include "Marker.h"

#ifdef _DEBUG
#include <iostream>
#endif

// コンストラクタ
Marker::Marker() : _Size(0) 
{
	_Dictionary = cv::aruco::getPredefinedDictionary(cv::aruco::DICT_4X4_50);
}

// マーカー座標の計算
void Marker::Generate(cv::Size imgsize) {
	// 定数の計算
	_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;
	// 座標計算
	for (int iy = 0; iy < 3; iy++) {
		for (int ix = 0; ix < 3; ix++) {
			if (ix == 1 && iy == 1) continue;	// 中心にはマーカーを置かない

			std::vector<cv::Point2f> 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);
		}
	}
}

// マーカーを描画する
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);
	}
}