#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);
}
}