|
|
|
|
@ -40,9 +40,11 @@
|
|
|
|
|
#define IMGCMP_CACHE_MAX_SIZE 100
|
|
|
|
|
|
|
|
|
|
#define MIN_CIRCLE_RADII 5
|
|
|
|
|
#define MAX_CIRCLE_RADII 110
|
|
|
|
|
#define MAX_CIRCLE_RADII_15 110 //15英寸轮毂内部抠图半径
|
|
|
|
|
#define MAX_CIRCLE_RADII_10 145 //10英寸轮毂内部抠图半径
|
|
|
|
|
#define MIN_INSIDE_RATIO 0.012
|
|
|
|
|
#define MAX_INSIDE_RATIO 0.023
|
|
|
|
|
#define PIXEL_IN_RATIO 125 //每英寸占多少像素
|
|
|
|
|
|
|
|
|
|
int ImageCompareModel::m_parallelFlag = 0;
|
|
|
|
|
cv::Point2f ImageCompareModel::refineCircleCen(const Mat& img, Point2f cen)
|
|
|
|
|
@ -501,18 +503,51 @@ double ImageCompareModel::compare(Mat srcImage, Mat* pRImg /*= NULL*/, int level
|
|
|
|
|
return cacheIter->second;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int x_Axis = srcImage.cols / 2 - MAX_CIRCLE_RADII;
|
|
|
|
|
int y_Axis = srcImage.rows / 2 - MAX_CIRCLE_RADII;
|
|
|
|
|
int r_Axis = 2 * MAX_CIRCLE_RADII;
|
|
|
|
|
int srcImageWidth = srcImage.cols;
|
|
|
|
|
int srcImageHeight = srcImage.rows;
|
|
|
|
|
|
|
|
|
|
//int x_Axis = srcImageWidth / 2 - MAX_CIRCLE_RADII;
|
|
|
|
|
//int y_Axis = srcImageHeight / 2 - MAX_CIRCLE_RADII;
|
|
|
|
|
//int r_Axis = 2 * MAX_CIRCLE_RADII;
|
|
|
|
|
//if (x_Axis <= 0 || y_Axis <= 0)
|
|
|
|
|
// return DBL_MAX;
|
|
|
|
|
//if (r_Axis <= 0)
|
|
|
|
|
// return DBL_MAX;
|
|
|
|
|
//if (r_Axis >= srcImageWidth || r_Axis >= srcImageHeight)
|
|
|
|
|
// return DBL_MAX;
|
|
|
|
|
//if (srcImageWidth < (srcImageWidth / 2 + MAX_CIRCLE_RADII) || srcImageHeight < (srcImageHeight / 2 + MAX_CIRCLE_RADII))
|
|
|
|
|
// return DBL_MAX;
|
|
|
|
|
|
|
|
|
|
//辨别轮毂尺寸来选择对应尺寸的抠图半径,和内外特征占比权重
|
|
|
|
|
int diameter = std::max(srcImageWidth, srcImageHeight);
|
|
|
|
|
float ratio = (float)diameter / PIXEL_IN_RATIO;
|
|
|
|
|
float diff1 = std::abs(ratio - 5);
|
|
|
|
|
float diff2 = std::abs(ratio - 7.5);
|
|
|
|
|
float alpha1 = 0, alpha2 = 0;
|
|
|
|
|
int max_circle_radii = 0;
|
|
|
|
|
if (diff1 < diff2)
|
|
|
|
|
{
|
|
|
|
|
alpha1 = 0.5;
|
|
|
|
|
alpha2 = 0.5;
|
|
|
|
|
max_circle_radii = MAX_CIRCLE_RADII_10;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
alpha1 = 0.6;
|
|
|
|
|
alpha2 = 0.4;
|
|
|
|
|
max_circle_radii = MAX_CIRCLE_RADII_15;
|
|
|
|
|
}
|
|
|
|
|
int x_Axis = srcImageWidth / 2 - max_circle_radii;
|
|
|
|
|
int y_Axis = srcImageHeight / 2 - max_circle_radii;
|
|
|
|
|
int r_Axis = 2 * max_circle_radii;
|
|
|
|
|
if (x_Axis <= 0 || y_Axis <= 0)
|
|
|
|
|
return DBL_MAX;
|
|
|
|
|
if (r_Axis <= 0)
|
|
|
|
|
return DBL_MAX;
|
|
|
|
|
if (r_Axis >= srcImage.cols || r_Axis >= srcImage.rows)
|
|
|
|
|
if (r_Axis >= srcImageWidth || r_Axis >= srcImageHeight)
|
|
|
|
|
return DBL_MAX;
|
|
|
|
|
if (srcImageWidth < (srcImageWidth / 2 + max_circle_radii) || srcImageHeight < (srcImageHeight / 2 + max_circle_radii))
|
|
|
|
|
return DBL_MAX;
|
|
|
|
|
if (srcImage.cols < (srcImage.cols / 2 + MAX_CIRCLE_RADII) || srcImage.rows < (srcImage.rows / 2 + MAX_CIRCLE_RADII))
|
|
|
|
|
return DBL_MAX;
|
|
|
|
|
|
|
|
|
|
Rect rect(x_Axis, y_Axis, r_Axis, r_Axis);
|
|
|
|
|
Mat srcCenterMat;
|
|
|
|
|
@ -602,7 +637,7 @@ double ImageCompareModel::compare(Mat srcImage, Mat* pRImg /*= NULL*/, int level
|
|
|
|
|
m_parallelFlag = 1;
|
|
|
|
|
double retInside = genMatchValue(camInsideMat, mInsideCompareBaseImg, unifiedInsideMask, 0, rawImg.rows, md_diameter, md_height);//得出相似值
|
|
|
|
|
|
|
|
|
|
ret = 0.6*ret + 0.4*retInside;
|
|
|
|
|
ret = alpha1*ret + alpha2*retInside;
|
|
|
|
|
|
|
|
|
|
if (ret > mDisThre)
|
|
|
|
|
{
|
|
|
|
|
@ -675,9 +710,29 @@ void ImageCompareModel::train(const vector<Mat>& vec)
|
|
|
|
|
|
|
|
|
|
//bob edit
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
int originalMatWidth = originalMat.cols;
|
|
|
|
|
int originalMatHeight = originalMat.rows;
|
|
|
|
|
|
|
|
|
|
//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);
|
|
|
|
|
|
|
|
|
|
int diameter = std::max(originalMatWidth, originalMatHeight);
|
|
|
|
|
float ratio = (float)diameter / PIXEL_IN_RATIO;
|
|
|
|
|
float diff1 = std::abs(ratio - 5);
|
|
|
|
|
float diff2 = std::abs(ratio - 7.5);
|
|
|
|
|
int max_circle_radii = 0;
|
|
|
|
|
if (diff1 < diff2)
|
|
|
|
|
{
|
|
|
|
|
max_circle_radii = MAX_CIRCLE_RADII_10;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
max_circle_radii = MAX_CIRCLE_RADII_15;
|
|
|
|
|
|
|
|
|
|
float startX = originalMatWidth / 2.0 - max_circle_radii;//找最大圆外径,固定直径
|
|
|
|
|
float startY = originalMatHeight / 2.0 - max_circle_radii;
|
|
|
|
|
Rect rect(startX, startY, max_circle_radii * 2, max_circle_radii * 2);
|
|
|
|
|
|
|
|
|
|
Mat origianlCenterMat;
|
|
|
|
|
originalMat(rect).copyTo(origianlCenterMat);
|
|
|
|
|
|
|
|
|
|
|