调整算法,适应汽轮型号识别项目

newClassify
bobpan 5 years ago
parent fc5d286602
commit e7f7389332

File diff suppressed because it is too large Load Diff

@ -15,8 +15,6 @@
#include <fstream>
#include "MultiScaleObj.h"
#include "ICompareModel.h"
#define COLS_SCALE (float)(1200.0/ 416.0)
using std::set;
using std::map;
using std::fstream;
@ -96,14 +94,9 @@ public:
float outterR = -1);
static void selfRotationSimilarityFeature(const Mat& img,
vector<float>& vec, Point2f cen = Point2f(-1, -1));
Mat genMask(const Mat& img, Point2f center, float innerR = -1,
float outterR = -1,
int type = CV_32FC1);
Mat genInsideMask (const Mat& img, Point2f center, float innerR = -1,
static Mat genMask(const Mat& img, Point2f center, float innerR = -1,
float outterR = -1,
int type = CV_32FC1);
static void genCandidateRepeatNums(set<unsigned int>& canNums);
int computeRepeatNum(const Mat& img);
static int recognizeLowerExtremes(const Mat& vec, set<unsigned int> canNums, int extremeRefineRange = 5, vector<int> *pExtemeIdxVec = 0);
@ -115,10 +108,8 @@ public:
static void genCandidateAngleRanges(const Mat& disMat, float angleStep,
vector<Range>& rangeVec, float rangeScale = 1);
static void selfRotateMin(const Mat& img, Mat& weightMat, int repeatNum);
float allocateInnerRadius(cv::Mat subImage);
float allocateRadius(cv::Mat subImage);
void resizeVecMat(vector<Mat> srcVec, vector<Mat> &dstVec);
void resizeMat(Mat src, Mat &dst);
public:
ImageCompareModel() :
mMatchValScale(1.0),
@ -136,21 +127,19 @@ public:
mpMultiScaleModel(NULL),
meanDiameter(0),
realWidth(0),
realHeight(0),
rInner(DBL_MAX)
realHeight(0)
{};
ImageCompareModel(const ImageCompareModel& model)
: mAlignBaseImg(model.getBaseImg().clone())
, mWeightMat(model.getWeightMat().clone())
, mMatchValScale(model.getMatchValScale())
, mInSideBaseImg(model.getInsideBaseImg().clone())
, mInsideWeightMat(model.getInsideWeightImg().clone())
{
genMask();
}
~ImageCompareModel() {};
void printInfo();
void saveImages(string dirPath);
bool save2file(string filePath);
bool readFromFile(string filePath);
@ -159,8 +148,6 @@ public:
{
mAlignBaseImg = model.getBaseImg().clone();
mWeightMat = model.getWeightMat().clone();
mInSideBaseImg = model.getInsideBaseImg().clone();
mInsideWeightMat = model.getInsideWeightImg().clone();
mMatchValScale = model.getMatchValScale();
mTargetMeanVal = model.getTargetMeanVal();
mTargetStddevVal = model.getTargetStddevVal();
@ -170,68 +157,61 @@ public:
mTrueSampleDisMax = model.getDisMax();
mTrueSampleDisMin = model.getDisMin();
meanDiameter = model.getMeanDiamter();
rInner = model.getInnerR();
}
void genMask();
void genOutterMask();
void preProcessImage(Mat& img, Mat &insideImg) const;
void preProcessImage(Mat& img) const;
void preProcessImage(Mat& img, const Mat& mask, double dstMean, double dstStddev, int highlightsThreshold) const;
void preProcessImage(Mat& img, const Mat& mask, const Mat& weightMat, double dstMean,
double dstStddev, int highlightsThreshold) const;
void preProcessImage0(Mat& img) const;
void weightOptimization(const vector<Mat>& falseSamples);
//! 将一个图像和标准图mBaseImg进行旋转匹配再相减求得差异值
//! 将一个图像和标准图mBaseImg进行旋转匹配再相减求得差异值
/*!
\param Mat img
\param Mat * pRImg
\param bool isFilterSize
\return double
\param Mat img
\param Mat * pRImg
\param bool isFilterSize
\return double
\see compare(Mat, Mat, Mat*, Mat*)
*/
double compare(Mat srcImage, Mat* pRImg = NULL, int levelNum = 1, bool isFilterSize = true, int flag = 0,
double compare(Mat img, Mat* pRImg = NULL, int levelNum = 1, bool isFilterSize = true, int flag = 0,
double md_diameter = 0, double md_height = 0);
//! 训练得到标准图像mBaseImg
//! 训练得到标准图像mBaseImg
/*!
\param const vector<Mat> & imgVec
\param const vector<Mat> & imgVec
\return void
*/
void train(const vector<Mat>& vec);
void train(const vector<Mat>& imgVec);
void calculateAllParams(const vector<Mat>& imgVec);
void trueSampleWeightRecon(const vector<Mat>& resizedVec, const vector<Mat>& resizedCenterVec, vector<RotateMatchResult> rmrVec,
vector<RotateMatchResult> rmrVecInside);
void trueWeightRecon(const Mat& rImg, const Mat& baseImg, const Mat& insideRimg, const Mat& insideBaseImg);
void weightMapping(const Mat& weight, double maxVal, const Mat& i_mData, double i_maxVal);
void trueSampleWeightRecon(const vector<Mat>& resizedVec, vector<RotateMatchResult> rmrVec);
void trueWeightRecon(const Mat& rImg, const Mat& baseImg);
void weightMapping(const Mat& weight, double maxVal);
//void falseWeightmapping(Mat &img);
double descendFunction(double pixVal, double maxVal);
double penltyCoeff(double matchedVal, int diameterMean, int targetDiameterm, double modelDiamter, double modelHeight) const;
//! 根据负样本计算差异阈值,用于判断任意一个新的图像是否属于该类别。
//! 根据负样本计算差异阈值,用于判断任意一个新的图像是否属于该类别。
/*!
\param const vector<Mat> & imgVec
\param const vector<Mat> & imgVec
\return void
*/
void computeDisThre(const vector<Mat>& imgVec, double* pMinDis = NULL, double md_diameter = 0, double md_height = 0);
double filterTrainImage(const Mat &img);
//! 并行计算rotate
//! 并行计算rotate
/*!
\param int index index
\param void *p
\param int index index
\param void *p
*/
void parallelDetect(int index, void *p) const;
//! 获取标准图像
//! 获取标准图像
/*!
\return cv::Mat
\return cv::Mat
*/
Mat getInsideBaseImg() const{ return mInSideBaseImg; }
Mat getInsideWeightImg() const{ return mInsideWeightMat; }
float getInnerR() const { return rInner; }
virtual Mat getBaseImg() const { return mAlignBaseImg; }
Mat getBaseImg() const { return mAlignBaseImg; }
void setBaseImg(const Mat& img) { mAlignBaseImg = img; }
@ -259,17 +239,17 @@ public:
double getFalseSampleMinDis() const { return mFalseSampleMinDis; }
double getMeanDiamter() const { return meanDiameter; }
//! 获取最近一次执行readFromFile时输入的文件路径
//! 获取最近一次执行readFromFile时输入的文件路径
/*!
\return string
\return string
*/
string getFilePath() const { return mFilePath; }
double getDisThre() const { return mDisThre; }
void setDisThre(double val) { mDisThre = val; }
//! 启用缓存。缓存会将每次调用compare接口输入的img参数的data指针作为key存储
// 差异值。
//! 启用缓存。缓存会将每次调用compare接口输入的img参数的data指针作为key存储
// 差异值。
/*!
\return void
*/
@ -300,16 +280,16 @@ public:
void setRealHeight(int val){ realHeight = val; }
int getRealWidth(){ return realWidth; }
int getRealHeight(){ return realHeight; }
void printLog(string root, string log, double n = 0) const;
protected:
//! 尚未完成将两个图像分别和标准图mBaseImg进行旋转匹配再相减求得差异值
//! 尚未完成将两个图像分别和标准图mBaseImg进行旋转匹配再相减求得差异值
/*!
\param Mat img0 img0
\param Mat img1 img1
\param Mat * pRImg0 img0mBaseImgrimg0
\param Mat * pRImg1 img1mBaseImgrimg1
\return double mMatchValScale*norm(rimg0 - rimg1)/(cols*rows)
\param Mat img0 img0
\param Mat img1 img1
\param Mat * pRImg0 img0mBaseImgrimg0
\param Mat * pRImg1 img1mBaseImgrimg1
\return double mMatchValScale*norm(rimg0 - rimg1)/(cols*rows)
*/
double compare(Mat img0, Mat img1, Mat* pRImg0 = NULL, Mat* pRImg1 = NULL);
@ -333,24 +313,16 @@ protected:
Mat mDisMat;
Mat reConMat;
Mat falseReConMat;
Mat insideWeightRecon;
Mat innerTempl;
double mDisThre{ DBL_MAX };
double mDisThre;
string mName;
double falseMinDis;
int meanDiameter;
int realWidth;
int realHeight;
// INSIDE PART
Mat mInSideBaseImg, mInsideCompareBaseImg;
Mat mInsideWeightMat;
Mat m32fInsideMaskImg, m8uInsideMaskImg;
float rInner;
float x_aix;
float y_aix;
// some training data
double mTrueSampleDisStddev, mTrueSampleDisMean, mTrueSampleDisMax{DBL_MAX}, mTrueSampleDisMin;
double mTrueSampleDisStddev, mTrueSampleDisMean, mTrueSampleDisMax, mTrueSampleDisMin;
double mFalseSampleMinDis;
// temp data
@ -361,8 +333,6 @@ protected:
// cache
bool mIsEnableCache;
map<uchar*, double> mDisCache;
public:
static int m_parallelFlag;
private:
};

@ -1,11 +1,13 @@
#include "MultiScaleImageCompareModel.h"
#include "ImageCompareModel.h"
//#include "../3rd/cvplot/cvplot.h"
void MultiScaleImageCompareModel::setBaseLevel(const ImageCompareModel* pModel)
{
ImageCompareModel* p = new ImageCompareModel;
*p = *pModel;
p->genOutterMask();
p->genMask();
clear();
mMultiScaleModels.resize(1);
mMultiScaleModels[0] = p;
@ -15,16 +17,11 @@ 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)
@ -58,19 +55,11 @@ void MultiScaleImageCompareModel::proc(void *pData)
vector<Range> angleRangeVec(1, Range(0, 360));
ImageCompareModel::RotateData* pRotateData = pCmpData->getRotateData();
int nlevel = getLevel();
while (nlevel >= 0)
while (getLevel() >= 0)
{
nlevel = getLevel();
if (nlevel<0)
break;
const ImageCompareModel* pModel = NULL;
if (nlevel >= mMultiScaleModels.size())
pModel = mMultiScaleModels[0];
else
pModel = mMultiScaleModels[nlevel];
const ImageCompareModel* pModel = mMultiScaleModels[getLevel()];
assert(pModel);
Mat img = pMSImg->getImg(nlevel);
Mat img = pMSImg->getImg(getLevel());
assert(!img.empty());
@ -111,6 +100,26 @@ void MultiScaleImageCompareModel::proc(void *pData)
// Mat viewBestRImg = pRotateData->bestRImg() / 255.0;
// imshow("bestRImg", viewBestRImg);
#endif
#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
downLevel();
}
}

@ -0,0 +1 @@
接口文件 公用

@ -1,11 +0,0 @@
#include "ThreadVector.h"
ThreadVector::ThreadVector()
{
}
ThreadVector::~ThreadVector()
{
}

@ -1,12 +0,0 @@
#pragma once
enum EM_THREAD_TASK {
emThreadSendState, emThreadSendLib, emThread
};
class ThreadVector
{
public:
ThreadVector();
~ThreadVector();
};

@ -47,7 +47,6 @@ QModelMgrDlg::QModelMgrDlg(IWheelCtrl *ptr, QWidget *parent)
m_pShowImgList = ui.listWidget;
m_pModelMgr = m_pCtrl->getModelMgr();
// m_pState = m_pCtrl->getDetectState();
m_trainAllTsk = new QMyThread();
m_trainAllTsk->setUser(true);
@ -58,9 +57,7 @@ QModelMgrDlg::QModelMgrDlg(IWheelCtrl *ptr, QWidget *parent)
m_trainOneTsk->loadfunc(this, &QModelMgrDlg::TrainOneTskFunc);
// m_pProgressView = new ProgressView(this);
// m_pProgressView->setUseCancel(true);
// connect(m_pProgressView, SIGNAL(cancel()), this, SLOT(onProgassCancel()));
//m_pProgressView->finish();
connect(this, SIGNAL(sgPrograssShow(QString, QString, int, int)), this, SLOT(onPrograssShow(QString, QString, int, int)));
connect(this, SIGNAL(sgShowMsg(QString)), this, SLOT(onShowMessage(QString)));
@ -357,6 +354,13 @@ Q_SLOT void QModelMgrDlg::onItemDoubleClicked(QListWidgetItem * item)
Q_SLOT void QModelMgrDlg::onPrograssShow(QString title, QString strValue, int size, int model)
{
if (!m_pProgressView)
{
m_pProgressView = new ProgressView(this);
m_pProgressView->setUseCancel(true);
connect(m_pProgressView, SIGNAL(cancel()), this, SLOT(onProgassCancel()));
//return;
}
switch (model)
{
case emPross_Init:

@ -55,7 +55,6 @@
<ClCompile Include="..\..\src\tpMain\qworkmgrui.cpp" />
<ClCompile Include="..\..\src\tpMain\splashScreen\qmysplashscreen.cpp" />
<ClCompile Include="..\..\src\tpMain\TempImage.cpp" />
<ClCompile Include="..\..\src\tpMain\ThreadVector.cpp" />
<ClCompile Include="..\..\src\tpMain\thread\qmythread.cpp" />
<ClCompile Include="..\..\src\tpMain\timemgrctrl.cpp" />
<ClCompile Include="..\..\src\tpMain\WheelCtrl.cpp" />
@ -486,7 +485,6 @@
<Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DWIN64 -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DTPMAIN_LIB -DTPMAIN_EXPORTS -DQT_GUI_LIB -DQT_WIDGETS_LIB -DQT_SQL_LIB -DQT_PRINTSUPPORT_LIB -DQT_NETWORK_LIB -DQT_SERIALPORT_LIB -D%(PreprocessorDefinitions) "-I." "-I.\GeneratedFiles" "-I.\GeneratedFiles\$(ConfigurationName)" "-I$(QTDIR)\include" "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui" "-I$(QTDIR)\include\QtWidgets" "-I$(QTDIR)\include\ActiveQt" "-I$(QTDIR)\include\QtSerialPort" "-I$(QTDIR)\include\QtANGLE" "-I$(QTDIR)\include\QtPrintSupport" "-I$(QTDIR)\include\QtSql" "-I$(QTDIR)\include\QtNetwork" "-I.\..\..\..\spider\libZK" "-I.\..\..\..\tadpole\include" "-I.\..\..\..\tadpole\src\SubFilters" "-I.\..\..\..\tadpole\src\SubFilters\tpSubFilterDemo" "-I.\..\..\..\tadpole\src\tpGui" "-I.\..\..\..\tadpole\src\tpBase" "-I.\..\..\..\tadpole\src\lpbengine" "-I.\..\..\..\tadpole\src\tpNet" "-I.\..\..\..\tadpole\src\lpdesigner" "-I.\..\..\..\tadpole\src\tpMain" "-I.\..\..\..\tadpole\src\tpSubFilter" "-I.\..\..\..\tadpole\src\libzkq" "-I.\..\..\..\tadpole\src\tpAssister" "-I.\..\..\include\tpMain" "-I.\..\..\include\tpMain\SubFilters" "-I.\..\include" "-I.\..\..\..\lpOpenCV\opencv2.4.9\build\include" "-I.\..\..\..\lpOpenCV\opencv2.4.9\build\include\opencv2" "-I.\..\..\..\lpOpenCV\opencv2.4.9\build\include\opencv" "-I.\..\..\..\Cyclops\include" "-I.\..\..\src\algorithm" "-I.\..\..\include" "-I.\..\..\.\src\tpMain" "-I.\..\..\.\src\tpMain\thread" "-I.\..\..\.\src\tpMain\splashScreen" "-I.\..\..\.\src\tpMain\LightBoxwidget" "-I.\..\..\.\src\tpMain\QDiskCleanThread" "-I.\..\..\.\src\tpMain\QPixmapListBar" "-I.\..\..\.\src\userCtrl" "-I.\..\..\.\src\NetWheel" "-I.\..\..\.\src\RasterSDG20" "-I.\..\..\.\src\ReportModel"</Command>
</CustomBuild>
<ClInclude Include="..\..\src\tpMain\TempImage.h" />
<ClInclude Include="..\..\src\tpMain\ThreadVector.h" />
<ClInclude Include="..\..\src\tpMain\timemgrctrl.h" />
<CustomBuild Include="..\..\src\tpMain\WheelCtrl.h">
<AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>

@ -329,9 +329,6 @@
<ClCompile Include="..\..\src\tpMain\TempImage.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\src\tpMain\ThreadVector.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\src\tpMain\timemgrctrl.cpp">
<Filter>Source Files</Filter>
</ClCompile>
@ -616,9 +613,6 @@
<ClInclude Include="..\..\src\tpMain\TempImage.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\src\tpMain\ThreadVector.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\src\tpMain\timemgrctrl.h">
<Filter>Header Files</Filter>
</ClInclude>

Loading…
Cancel
Save