You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
whellvalue/tpvs17/ModelTest/ImageCompare/MultiScaleImageCompareModel...

147 lines
4.3 KiB
C++

#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<Range> 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<float>(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<float>(ss.str(), &(testRotateData.mDisValVec[0]),
testRotateData.mDisValVec.size());
}
#endif
#endif
downLevel();
}
}