|
|
|
|
@ -14,8 +14,11 @@
|
|
|
|
|
|
|
|
|
|
#pragma execution_character_set("utf-8")
|
|
|
|
|
|
|
|
|
|
#define MIN_INSIDE_RATIO 0.012
|
|
|
|
|
#define MAX_INSIDE_RATIO 0.023
|
|
|
|
|
#define MAX_CIRCLE_RADII 110
|
|
|
|
|
#define MIN_INSIDE_RATIO 0.038
|
|
|
|
|
#define MAX_INSIDE_RATIO 0.072
|
|
|
|
|
#define INSIDE_NUM_DIS_THRE 1.5
|
|
|
|
|
|
|
|
|
|
using namespace cv;
|
|
|
|
|
using namespace lp;
|
|
|
|
|
|
|
|
|
|
@ -54,8 +57,11 @@ QString CAlgorithmFluorescence::bestMatch(const QMap<QString, IWheelModel*>* mod
|
|
|
|
|
if (!modelMap)
|
|
|
|
|
return bestName;
|
|
|
|
|
QStringList strDetectModels = pLocal->defectList;
|
|
|
|
|
cv::Mat img = pLocal->img;
|
|
|
|
|
|
|
|
|
|
int similarNum = 0;
|
|
|
|
|
const QString hubName1("DH151079");
|
|
|
|
|
const QString hubName2("DK151050");
|
|
|
|
|
QMap<QString, double> simularModelMap;
|
|
|
|
|
while (strDetectModels.size())
|
|
|
|
|
{
|
|
|
|
|
QString strModelName = strDetectModels.takeFirst();
|
|
|
|
|
@ -90,10 +96,16 @@ QString CAlgorithmFluorescence::bestMatch(const QMap<QString, IWheelModel*>* mod
|
|
|
|
|
|
|
|
|
|
pModel->setIsEnableCache(false);
|
|
|
|
|
|
|
|
|
|
double dis = pModel->compare(img, NULL, true, 1);
|
|
|
|
|
double dis = pModel->compare(pLocal->img, NULL, true, 1);
|
|
|
|
|
double disThre = pModel->getDisThre();
|
|
|
|
|
double innerCircleNum = pModel->getInnerCircleNum();
|
|
|
|
|
if (dis < disThre)
|
|
|
|
|
{
|
|
|
|
|
similarNum++;
|
|
|
|
|
simularModelMap[name] = innerCircleNum;
|
|
|
|
|
}
|
|
|
|
|
disVec[nIndex] = dis;
|
|
|
|
|
/* std::map<float, std::string> disMap;
|
|
|
|
|
disMap[dis] = name;*/
|
|
|
|
|
|
|
|
|
|
if (dis < minDis && dis != -1)
|
|
|
|
|
{
|
|
|
|
|
minDis = dis;
|
|
|
|
|
@ -101,6 +113,7 @@ QString CAlgorithmFluorescence::bestMatch(const QMap<QString, IWheelModel*>* mod
|
|
|
|
|
}
|
|
|
|
|
nIndex++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (pMinDis)
|
|
|
|
|
{
|
|
|
|
|
*pMinDis = minDis;
|
|
|
|
|
@ -110,33 +123,96 @@ QString CAlgorithmFluorescence::bestMatch(const QMap<QString, IWheelModel*>* mod
|
|
|
|
|
sort(disVec.begin(), disVec.end());
|
|
|
|
|
std::copy_n(disVec.begin(), minDisNum, pMinDis);
|
|
|
|
|
}
|
|
|
|
|
//if (0)
|
|
|
|
|
//{
|
|
|
|
|
// EDCircles edCircles(img);
|
|
|
|
|
// std::vector<mCircle> circles = edCircles.getCircles();
|
|
|
|
|
// const int nSize = circles.size();
|
|
|
|
|
// float rMax = 0;
|
|
|
|
|
if (similarNum < 1)
|
|
|
|
|
{
|
|
|
|
|
return bestName;
|
|
|
|
|
}
|
|
|
|
|
const cv::Mat originalMat = pLocal->img;
|
|
|
|
|
float startX = originalMat.cols / 2.0 - MAX_CIRCLE_RADII;//找最大圆外径,固定直径
|
|
|
|
|
float startY = originalMat.rows / 2.0 - MAX_CIRCLE_RADII;
|
|
|
|
|
Rect rect(startX, startY, MAX_CIRCLE_RADII * 2, MAX_CIRCLE_RADII * 2);
|
|
|
|
|
cv::Mat centerMat = originalMat(rect).clone();
|
|
|
|
|
EDCircles edCircles(centerMat);
|
|
|
|
|
std::vector<mCircle> circles = edCircles.getCircles();
|
|
|
|
|
const int nSize = circles.size();
|
|
|
|
|
float rMax = 0;
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < nSize; ++i)
|
|
|
|
|
{
|
|
|
|
|
float radius = circles[i].r;
|
|
|
|
|
if (radius > rMax)
|
|
|
|
|
{
|
|
|
|
|
rMax = radius;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
double innerCircleNumSum = 0;
|
|
|
|
|
double rMaxUp = rMax * MAX_INSIDE_RATIO;
|
|
|
|
|
double rMaxLow = rMax * MIN_INSIDE_RATIO;
|
|
|
|
|
for (int i = 0; i < nSize; ++i)
|
|
|
|
|
{
|
|
|
|
|
double radius = circles[i].r;
|
|
|
|
|
if (radius < rMaxUp && radius > rMaxLow * MIN_INSIDE_RATIO)
|
|
|
|
|
{
|
|
|
|
|
innerCircleNumSum++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (bestName.toUpper() == hubName1)
|
|
|
|
|
{
|
|
|
|
|
if (innerCircleNumSum > 1)
|
|
|
|
|
{
|
|
|
|
|
bestName = hubName2;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if (bestName.toUpper() == hubName2)
|
|
|
|
|
{
|
|
|
|
|
if (innerCircleNumSum < 2)
|
|
|
|
|
{
|
|
|
|
|
bestName = hubName1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// for (int i = 0; i < nSize; ++i)
|
|
|
|
|
//if (similarNum == 1)
|
|
|
|
|
//{
|
|
|
|
|
// float radius = circles[i].r;
|
|
|
|
|
// if (radius > rMax)
|
|
|
|
|
// double dis = std::fabs(innerCircleNumSum - simularModelMap.begin().value());
|
|
|
|
|
// if (dis > INSIDE_NUM_DIS_THRE)
|
|
|
|
|
// {
|
|
|
|
|
// rMax = radius;
|
|
|
|
|
// bestName = QString();
|
|
|
|
|
// }
|
|
|
|
|
//}
|
|
|
|
|
// float insideCircleNumSum = 0;
|
|
|
|
|
// for (int i = 0; i < nSize; ++i)
|
|
|
|
|
//if (similarNum > 1)
|
|
|
|
|
//{
|
|
|
|
|
// auto iterEnd = simularModelMap.constEnd();
|
|
|
|
|
// double disMin = DBL_MAX;
|
|
|
|
|
|
|
|
|
|
// for (auto iter = simularModelMap.constBegin(); iter != iterEnd; ++iter)
|
|
|
|
|
// {
|
|
|
|
|
// double radius = circles[i].r;
|
|
|
|
|
// if (radius < rMax * MAX_INSIDE_RATIO && radius > rMax * MIN_INSIDE_RATIO)
|
|
|
|
|
// double dis = std::fabs(innerCircleNumSum - iter.value());
|
|
|
|
|
// if (dis < disMin)
|
|
|
|
|
// {
|
|
|
|
|
// insideCircleNumSum++;
|
|
|
|
|
// disMin = dis;
|
|
|
|
|
// bestName = iter.key();
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// //if()
|
|
|
|
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
//auto iterEnd = simularModelMap.constEnd();
|
|
|
|
|
//bool bestMatchFlag = false;
|
|
|
|
|
//for (auto iter = simularModelMap.constBegin(); iter != iterEnd; ++iter)
|
|
|
|
|
//{
|
|
|
|
|
// double dis = std::fabs(innerCircleNumSum - iter.value());
|
|
|
|
|
// if (dis < INSIDE_NUM_DIS_THRE)
|
|
|
|
|
// {
|
|
|
|
|
// bestName = iter.key();
|
|
|
|
|
// bestMatchFlag = true;
|
|
|
|
|
// break;
|
|
|
|
|
// }
|
|
|
|
|
//}
|
|
|
|
|
//if (!bestMatchFlag)
|
|
|
|
|
//{
|
|
|
|
|
// bestName = QString();
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
return bestName;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -164,6 +240,7 @@ int CAlgorithmFluorescence::IImageAnalysis(class IImageObject* pImgObj, TP_ALGOR
|
|
|
|
|
bool useDiameter = vMap.value("useDiameter", 0).toBool();
|
|
|
|
|
double dD2H = vMap.value("d2h", -1).toDouble();
|
|
|
|
|
int nthreshold = vMap.value("Threshold", 15).toInt();
|
|
|
|
|
bool bUseBackground = vMap.value("useBackground").toBool();
|
|
|
|
|
|
|
|
|
|
if (nthreshold <= 0)
|
|
|
|
|
nthreshold = 15;
|
|
|
|
|
|