|
|
#include "Base_matcher.h"
|
|
|
#include "PatternMatching.h"
|
|
|
#include "Arith_ImgOperate.h"
|
|
|
|
|
|
|
|
|
namespace templateMatching
|
|
|
{
|
|
|
Fast_Matcher* GetMatcher(const MatcherParam& param)
|
|
|
{
|
|
|
MatcherParam paramCopy = param;
|
|
|
BaseMatcher* matcher = nullptr;
|
|
|
|
|
|
switch (paramCopy.matcherType)
|
|
|
{
|
|
|
case MatcherType::PATTERN:
|
|
|
//logger_->info("Initializing matcher for type: PATTERN");
|
|
|
matcher = new PatternMatcher(paramCopy);
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
if (matcher->isInited() == false)
|
|
|
{
|
|
|
delete matcher;
|
|
|
matcher = nullptr;
|
|
|
}
|
|
|
|
|
|
return matcher;
|
|
|
}
|
|
|
|
|
|
void Matcher_Create(templateMatching::Fast_Matcher** matcher)
|
|
|
{
|
|
|
// 匹配器参数
|
|
|
templateMatching::MatcherParam param;
|
|
|
param.angle = 0; // 旋转角度容纳范围,0表示无旋转角度
|
|
|
param.iouThreshold = 0.1;
|
|
|
param.matcherType = templateMatching::MatcherType::PATTERN;
|
|
|
param.maxCount = 6; // 输出候选个数
|
|
|
param.minArea = 256;
|
|
|
param.scoreThreshold = 0.5;
|
|
|
|
|
|
*matcher = GetMatcher(param);
|
|
|
|
|
|
(*matcher)->g_Matcher_Image = new UINT16[MATCHER_MAX * MATCHER_MAX]; // 锁定创建,解锁需要释放
|
|
|
}
|
|
|
|
|
|
void Matcher_SetTemplate(templateMatching::Fast_Matcher* matcher, GD_VIDEO_FRAME_S img, RECT32S crfCandiRect)
|
|
|
{
|
|
|
MINMAXRECT mmRect = { 0 };
|
|
|
|
|
|
cv::Mat roi = cv::Mat(crfCandiRect.h, crfCandiRect.w, 0);
|
|
|
if (GD_PIXEL_FORMAT_E::GD_PIXEL_FORMAT_GRAY_Y16 == img.enPixelFormat)
|
|
|
{
|
|
|
GD_FRAME_pyrDownToY16(img, matcher->g_Matcher_Image, 1, crfCandiRect, mmRect);
|
|
|
IMGO_gcABCLinRoi(matcher->g_Matcher_Image, roi.data, crfCandiRect.w * crfCandiRect.h);
|
|
|
}
|
|
|
else if (GD_PIXEL_FORMAT_E::GD_PIXEL_FORMAT_GRAY_Y8 == img.enPixelFormat ||
|
|
|
GD_PIXEL_FORMAT_E::GD_PIXEL_FORMAT_RGB_PACKED == img.enPixelFormat ||
|
|
|
GD_PIXEL_FORMAT_E::GD_PIXEL_FORMAT_NV12 == img.enPixelFormat)
|
|
|
{
|
|
|
GD_FRAME_pyrDownToY8(img, roi.data, 1, crfCandiRect, mmRect);
|
|
|
}
|
|
|
|
|
|
matcher->setTemplate(roi);
|
|
|
}
|
|
|
|
|
|
void Matcher_Destory(templateMatching::Fast_Matcher* matcher)
|
|
|
{
|
|
|
delete matcher->g_Matcher_Image;
|
|
|
delete matcher;
|
|
|
}
|
|
|
|
|
|
|
|
|
void Matcher_Process(templateMatching::Fast_Matcher* matcher, GD_VIDEO_FRAME_S img, OBJECTSTATUS* pTrackStatus, TSky_Output* pTSky_Output)
|
|
|
{
|
|
|
SINT16 scale = 7;
|
|
|
SINT32 regionW = SINT32(scale * pTrackStatus->sfSize.w);
|
|
|
SINT32 regionH = SINT32(scale * pTrackStatus->sfSize.h);
|
|
|
|
|
|
RECT32S sRect = { SINT32(pTrackStatus->ptPos.x - 3.5 * pTrackStatus->sfSize.w), SINT32(pTrackStatus->ptPos.y - 3.5 * pTrackStatus->sfSize.h),
|
|
|
regionW, regionH };
|
|
|
|
|
|
cv::Mat searchRegion = cv::Mat(regionH, regionW, CV_8UC1, cv::Scalar(0));
|
|
|
|
|
|
MINMAXRECT mmRect = { 0 };
|
|
|
if (GD_PIXEL_FORMAT_E::GD_PIXEL_FORMAT_GRAY_Y16 == img.enPixelFormat)
|
|
|
{
|
|
|
GD_FRAME_pyrDownToY16(img, matcher->g_Matcher_Image, 1, sRect, mmRect);
|
|
|
IMGO_gcABCLinRoi(matcher->g_Matcher_Image, searchRegion.data, regionW * regionH);
|
|
|
}
|
|
|
else if (GD_PIXEL_FORMAT_E::GD_PIXEL_FORMAT_GRAY_Y8 == img.enPixelFormat ||
|
|
|
GD_PIXEL_FORMAT_E::GD_PIXEL_FORMAT_RGB_PACKED == img.enPixelFormat ||
|
|
|
GD_PIXEL_FORMAT_E::GD_PIXEL_FORMAT_NV12 == img.enPixelFormat)
|
|
|
{
|
|
|
GD_FRAME_pyrDownToY8(img, searchRegion.data, 1, sRect, mmRect);
|
|
|
}
|
|
|
|
|
|
pTSky_Output->m_nMatcherNum = 0;
|
|
|
SINT32 matchedNum = matcher->match(searchRegion, sRect, matcher->matchResults);
|
|
|
|
|
|
if (matchedNum > 0)
|
|
|
{
|
|
|
pTSky_Output->m_nMatcherNum = matchedNum;
|
|
|
for (int i = 0; i < MIN(matcher->matchResults.size(), DT_MATCHER_MAX_NUM); ++i)
|
|
|
{
|
|
|
memcpy(&pTSky_Output->mMatcher_Array[i], &matcher->matchResults[i], sizeof(MATCHER_TARGET));
|
|
|
}
|
|
|
}
|
|
|
// 计算得到最佳匹配结果,并进行尺寸、匹配特性分析
|
|
|
|
|
|
|
|
|
}
|
|
|
} |