#include <mil.h>
#include "ColorMatchTask.h"
CColorMatchTask::CColorMatchTask(MIL_CONST_TEXT_PTR ColContextPath,
const MIL_INT* ExpectedMatches,
MIL_INT ColorConversion ,
CInspectionTask* FixtureProvider ,
CInspectionTask* ImageProvider ,
CInspectionTask* RegionProvider )
: CHighLevelInspectionTask(ColContextPath, McolFree, M_NONE, FixtureProvider, ImageProvider, RegionProvider),
CRegionMngr(),
m_ExpectedMatches(ExpectedMatches),
m_BestMatchProductIndexTable(NULL)
{
}
CColorMatchTask::~CColorMatchTask()
{
}
void CColorMatchTask::Free()
{
CRegionMngr::Free();
CHighLevelInspectionTask::Free();
if(m_BestMatchProductIndexTable)
{
delete [] m_BestMatchProductIndexTable;
m_BestMatchProductIndexTable = NULL;
}
}
void CColorMatchTask::Init(MIL_ID MilSystem, MIL_INT ImageSizeX , MIL_INT ImageSizeY )
{
CRegionMngr::Init(MilSystem, ImageSizeX, ImageSizeY);
CHighLevelInspectionTask::Init(MilSystem, ImageSizeX, ImageSizeY);
}
bool CColorMatchTask::Calculate(MIL_ID MilImage)
{
MIL_ID MilAreaImage = HasRegionProvider() ? RasterizeRegion(MilImage, GetInputRegionList()) : M_NULL;
McolMatch(MilContext(), MilImage, M_DEFAULT, MilAreaImage, MilResult(), M_DEFAULT);
McolGetResult(MilResult(), M_ALL, M_GENERAL, M_BEST_MATCH_INDEX + M_NB_ELEMENTS + M_TYPE_MIL_INT, &m_NbAreas);
if(m_BestMatchProductIndexTable)
delete [] m_BestMatchProductIndexTable;
m_BestMatchProductIndexTable = new MIL_INT[m_NbAreas];
McolGetResult(MilResult(), M_ALL, M_GENERAL, M_BEST_MATCH_INDEX + M_TYPE_MIL_INT, m_BestMatchProductIndexTable);
return true;
}
void CColorMatchTask::DrawGraphicalResult(MIL_ID MilGraContext, MIL_ID MilDest)
{
MgraColor(MilGraContext, M_COLOR_MAGENTA);
CInspectionTask::DrawInputRegion(MilGraContext, MilDest);
MgraColor(MilGraContext, M_COLOR_MAGENTA);
for(MIL_INT AreaIdx = 0; AreaIdx < m_NbAreas; AreaIdx++)
CRegionMngr::DrawTextInRegion(MilGraContext, GetInputRegionList(), MilDest, AreaIdx, GetBestMatchLabel(m_BestMatchProductIndexTable[AreaIdx]));
}
void CColorMatchTask::DrawTextResult(MIL_ID MilGraContext, MIL_ID MilDest)
{
MIL_TEXT_CHAR OutputString[256];
MIL_CONST_TEXT_PTR MatchText = m_NbAreas > 1 ? MIL_TEXT("matches") : MIL_TEXT("match");
if(GetResultStatus() == eUnknown)
{
MgraColor(MilGraContext, M_COLOR_YELLOW);
MosSprintf(OutputString, 256, MIL_TEXT("%s color %s: UNKNOWN"), GetProductLabel(), MatchText);
}
else
{
bool AllAreasValid = true;
if(m_ExpectedMatches != NULL)
{
for(MIL_INT AreaIdx = 0; AreaIdx < m_NbAreas && AllAreasValid; AreaIdx++)
AllAreasValid = m_BestMatchProductIndexTable[AreaIdx] == m_ExpectedMatches[AreaIdx];
}
if(IsResultValid() && AllAreasValid)
{
MgraColor(MilGraContext, M_COLOR_GREEN);
MosSprintf(OutputString, 256, MIL_TEXT("%s color %s: PASS"), GetProductLabel(), MatchText);
}
else
{
MgraColor(MilGraContext, M_COLOR_RED);
MosSprintf(OutputString, 256, MIL_TEXT("%s color %s: FAIL"), GetProductLabel(), MatchText);
}
}
MgraText(MilGraContext, MilDest, 0, 0, OutputString);
MoveGraphicContextYOffset(MilGraContext, 1);
}