#include "MultiScaleImageCompareModel.h" #include "ImageCompareModel.h" // no need to code for plotting in visual studio later than 2017, // install the ArrayPlotter extension to see the data distribution #if (_MSC_VER < 1910) // vs2017 #include "../3rd/cvplot/cvplot.h" #endif void MultiScaleImageCompareModel::setBaseLevel(const ImageCompareModel* pModel) { ImageCompareModel* p = new ImageCompareModel; *p = *pModel; p->genOutterMask(); clear(); mMultiScaleModels.resize(1); mMultiScaleModels[0] = p; } void MultiScaleImageCompareModel::genMultiScale() { resetMaxLevel(); while (getLevel() >= 1) { if (mMultiScaleModels.size()>1) { ImageCompareModel* pScaledModel = mMultiScaleModels.back()->scale(mScaleStep); mMultiScaleModels.push_back(pScaledModel); downLevel(); } else downLevel(); } } const ImageCompareModel* MultiScaleImageCompareModel::getCmpModel(int level) { if (level >= 0 && level < mLevelNum) { return mMultiScaleModels[level]; } else { return NULL; } } void MultiScaleImageCompareModel::clear() { for_each(mMultiScaleModels.begin(), mMultiScaleModels.end(), [&](ImageCompareModel* p) { delete p; }); } void MultiScaleImageCompareModel::proc(void *pData) { ImageCompareData* pCmpData = (ImageCompareData*)pData; MultiScaleImage* pMSImg = pCmpData->getMSI(); resetMaxLevel(); float startAngle = pCmpData->getStartAngle(); float endAngle = pCmpData->getEndAngle(); float angleRange = (endAngle - startAngle) / 4.0; vector angleRangeVec(1, Range(0, 360)); ImageCompareModel::RotateData* pRotateData = pCmpData->getRotateData(); int nlevel = getLevel(); while (nlevel >= 0) { nlevel = getLevel(); if (nlevel<0) break; const ImageCompareModel* pModel = NULL; if (nlevel >= mMultiScaleModels.size()) pModel = mMultiScaleModels[0]; else pModel = mMultiScaleModels[nlevel]; assert(pModel); Mat img = pMSImg->getImg(nlevel); assert(!img.empty()); #ifdef DEBUG_VIEW_INTERNAL_MAT Mat viewImg = img / 255.0; imshow("img", viewImg); #endif if (angleRangeVec.size() == 1 && angleRangeVec.front().size() >= 360) { pModel->rotateMatchData(img, pRotateData, 1.0, startAngle, endAngle); ImageCompareModel::genCandidateAngleRanges(pRotateData->mDisValVec, 1, angleRangeVec); if (angleRangeVec.empty()) { pRotateData->mDisValVec.clear(); pRotateData->mRImgVec.clear(); angleRangeVec.resize(1); angleRangeVec[0] = Range(0, 360); } } else { Mat disMat; pModel->rotateMatchData(img, pRotateData, angleRangeVec, 1.0, disMat); ImageCompareModel::genCandidateAngleRanges(disMat, 1, angleRangeVec, 0.5); // pModel->rotateMatchData(img, pRotateData, 1.0, angleRangeVec); // // double bestAngle = pRotateData->bestAngle(); // angleRangeVec.clear(); // Range r; // r.start = bestAngle - angleRange; // r.end = bestAngle + angleRange; // angleRangeVec.push_back(r); } #ifdef DEBUG_VIEW_INTERNAL_MAT // Mat viewBestRImg = pRotateData->bestRImg() / 255.0; // imshow("bestRImg", viewBestRImg); #endif // no need to code for plotting in visual studio later than 2017, // install the ArrayPlotter extension to see the data distribution #if (_MSC_VER < 1910) // vs2017 #ifdef DEBUG_VIEW_PLOT { stringstream ss; ss << "multi_scale_comp_plot" << getLevel(); CvPlot::clear(ss.str()); CvPlot::plot(ss.str(), &(pRotateData->mDisValVec[0]), pRotateData->mDisValVec.size()); } { stringstream ss; ss << "multi_scale_comp_plot_0_360_" << getLevel(); CvPlot::clear(ss.str()); ImageCompareModel::RotateData testRotateData = *pRotateData; pModel->rotateMatchData(img, &testRotateData, 1.0, startAngle, endAngle); CvPlot::plot(ss.str(), &(testRotateData.mDisValVec[0]), testRotateData.mDisValVec.size()); } #endif #endif downLevel(); } }