#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;
for (int i = 0; i < _Corners.size(); i++) {
cv::aruco::drawMarker(_Dictionary, i, _Size, marker);
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 roi(img, cv::Rect(p, cv::Size(_Size, _Size)));
marker.copyTo(roi);
}
}