#include "DetectMacbeth.h"

//-------------------------------------------------------------------------------
// コンストラクタ
CDetectMacbeth::CDetectMacbeth(void)
{
}

//-------------------------------------------------------------------------------
// デストラクタ
CDetectMacbeth::~CDetectMacbeth(void)
{
}

//-------------------------------------------------------------------------------
// 初期化
bool CDetectMacbeth::Init()
{
	// マクベスの参照テンプレート画像を読み込み
	CALL(this->SetTemplate(MACBETH));

	m_NumPatch   = M_NUM_PATCH;
	m_RotateStep = M_ROTATE_STEP;
	m_PatchSize  = M_PATCH_SIZE;

	SAFE_DELETEA(m_PatchPos);
	m_PatchPos = new CvPoint [m_NumPatch];

	return true;
}

//-------------------------------------------------------------------------------
// 検出処理
bool CDetectMacbeth::Detect()
{
	// ROI解除
	cvResetImageROI(m_Input);

	// マクベスの検出とパッチ位置取得
	CvPoint pos;
	double angle;
	CALL(CDetect::Matching(&pos, &angle));
	CALL(this->CalcPatchPosition(pos, angle));

	return true;
}

//-------------------------------------------------------------------------------
// 各パッチの位置と角度を計算する
bool CDetectMacbeth::CalcPatchPosition(CvPoint pos, double angle)
{
	// パッチの向き（上下）
	int dir = angle < 90 ? 1 : -1;
	int startX = pos.x - dir * (M_PATCH_SPACE * 3) / 2;
	int startY = pos.y + dir * (M_PATCH_SPACE * 5) / 2;

	for (int i = 0; i < 4; i ++)
	{
		for (int j = 0; j < 6; j ++)
		{
			m_PatchPos[i * 6 + j].x = startX + dir * i * M_PATCH_SPACE;
			m_PatchPos[i * 6 + j].y = startY - dir * j * M_PATCH_SPACE;
		}
	}

	return true;
}