#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 = scale * pTrackStatus->sfSize.w; SINT32 regionH = 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)); } } } }