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