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.
109 lines
2.6 KiB
C
109 lines
2.6 KiB
C
|
5 years ago
|
#pragma once
|
||
|
|
#include "Luffy.h"
|
||
|
|
#include "lpbengine.h"
|
||
|
|
using namespace cv;
|
||
|
|
class RData
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
RData() {};
|
||
|
|
RData(const Mat &img, Point pt, double dAngleStep, int size)
|
||
|
|
: mImgSrc(img)
|
||
|
|
, mStartAngle(0)
|
||
|
|
, mEndAngle(360)
|
||
|
|
{
|
||
|
|
init(img, pt, dAngleStep, size);
|
||
|
|
};
|
||
|
|
void init(const Mat& img, Point pt, double dAngleStep, int size)
|
||
|
|
{
|
||
|
|
mImgSrc = img;
|
||
|
|
mStartAngle = 0;
|
||
|
|
mEndAngle = 360.0;
|
||
|
|
mRImgVec.clear();
|
||
|
|
mRImgVec.resize(size);
|
||
|
|
mDisValVec.clear();
|
||
|
|
mDisValVec.resize(size, FLT_MAX);
|
||
|
|
mCenter = pt;
|
||
|
|
mAngleStep = dAngleStep;
|
||
|
|
}
|
||
|
|
double angle(int index)
|
||
|
|
{
|
||
|
|
return index*mAngleStep + mStartAngle;
|
||
|
|
}
|
||
|
|
double bestAngle()
|
||
|
|
{
|
||
|
|
if (mDisValVec.empty())
|
||
|
|
{
|
||
|
|
return -DBL_MAX;
|
||
|
|
}
|
||
|
|
size_t bestIndex = min_element(mDisValVec.begin(),
|
||
|
|
mDisValVec.end()) - mDisValVec.begin();
|
||
|
|
double bestAngle = angle(bestIndex);
|
||
|
|
return bestAngle;
|
||
|
|
}
|
||
|
|
Mat bestRImg()
|
||
|
|
{
|
||
|
|
if (mRImgVec.empty())
|
||
|
|
{
|
||
|
|
return Mat();
|
||
|
|
}
|
||
|
|
size_t bestIndex = min_element(mDisValVec.begin(),
|
||
|
|
mDisValVec.end()) - mDisValVec.begin();
|
||
|
|
return mRImgVec[bestIndex];
|
||
|
|
}
|
||
|
|
double mAngleStep;
|
||
|
|
Mat mImgSrc;
|
||
|
|
Point mCenter;
|
||
|
|
vector<Mat> mRImgVec;
|
||
|
|
vector<float> mDisValVec;
|
||
|
|
|
||
|
|
float mStartAngle, mEndAngle;
|
||
|
|
};
|
||
|
|
|
||
|
|
class modelVerfication
|
||
|
|
{
|
||
|
|
|
||
|
|
public:
|
||
|
|
modelVerfication(double tarStddevVal, double tarMeanVal);
|
||
|
|
~modelVerfication();
|
||
|
|
|
||
|
|
Mat extractForegroundWheel(const Mat& background, const Mat& src);
|
||
|
|
Mat findWheelObject(Mat src, Mat backGroundImg, int thresh);
|
||
|
|
void rotateMatchData(const Mat& _img, const Mat &baseImage, RData* pData, float angleStep, float startAngle, float endAngle);
|
||
|
|
void parallelDetect(int index, void *p, Mat templ);
|
||
|
|
void preProcessImage(Mat& img, const Mat& mask, double dstMean, double dstStddev, int highlightsThreshold);
|
||
|
|
Mat genMask(const Mat& img, Point2f center, float innerR = -1,
|
||
|
|
float outterR = -1,
|
||
|
|
int type = CV_32FC1);
|
||
|
|
cv::Mat cocentricNorm(Mat& img, Point2f center, const Mat& weightMat, float dstMeanVal);
|
||
|
|
float interpolate(float* pY, int n, float stepX, float x);
|
||
|
|
bool objectVerification(const Mat &img, Mat& baseImage, double modelValidThresh, int endAngle, double & s);
|
||
|
|
void setWeightMat(const Mat& img)
|
||
|
|
{
|
||
|
|
weightMat = img;
|
||
|
|
weightMat.convertTo(weightMat, CV_32FC1);
|
||
|
|
}
|
||
|
|
|
||
|
|
static int h;
|
||
|
|
private:
|
||
|
|
Mat weightMat;
|
||
|
|
Mat m32fMaskImg;
|
||
|
|
double tarStddev;
|
||
|
|
double tarMean;
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
class ImageCompareModel2 : public cv::ParallelLoopBody
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
ImageCompareModel2(modelVerfication *m, void* pData, Mat T)
|
||
|
|
: m_pData(pData), model(m), templ(T)
|
||
|
|
{}
|
||
|
|
private:
|
||
|
|
void *m_pData;
|
||
|
|
modelVerfication* model;
|
||
|
|
Mat templ;
|
||
|
|
virtual void operator() (const cv::Range& range) const;
|
||
|
|
};
|
||
|
|
|