diff --git a/src/ImageCompare/ImageCompareModel.cpp b/src/ImageCompare/ImageCompareModel.cpp index 614f797..f3e6bd2 100644 --- a/src/ImageCompare/ImageCompareModel.cpp +++ b/src/ImageCompare/ImageCompareModel.cpp @@ -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& 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); diff --git a/tpvs17/Enchanter/main.cpp b/tpvs17/Enchanter/main.cpp index 58b2c75..2fdf761 100644 --- a/tpvs17/Enchanter/main.cpp +++ b/tpvs17/Enchanter/main.cpp @@ -5,10 +5,11 @@ #include "QSignleApplication.h" #include "dumpfile.h" + #pragma execution_character_set("utf-8") int main(int argc, char *argv[]) { - DeclareDumpFile(); + //DeclareDumpFile(); QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); IMainWidget* pMain = nullptr; QWidget* pMainWid = nullptr; diff --git a/tpvs17/tpMain/lpMainWin.cpp b/tpvs17/tpMain/lpMainWin.cpp index b5ec8c8..d5ffb37 100644 --- a/tpvs17/tpMain/lpMainWin.cpp +++ b/tpvs17/tpMain/lpMainWin.cpp @@ -22,9 +22,9 @@ #include "databasesql.h" #include "lpCryptokey.h" -#define VERSION_HUB "3.0.5.0" -#define VERSION_ALG "3.0.1.4" -#define UPDATE_TIME "2021-12-19" +#define VERSION_HUB "3.0.5.1" +#define VERSION_ALG "3.0.1.5" +#define UPDATE_TIME "2021-12-24" #pragma execution_character_set("utf-8") #define MODEL_UI_ICON_NONE ":/image/no-img"