From 108706cad5bbc7fb857748c391d50389ac01c277 Mon Sep 17 00:00:00 2001 From: QuShuailong Date: Mon, 17 Jan 2022 16:21:44 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=A2=9E=E5=8A=A0=E6=A0=B9=E6=8D=AE?= =?UTF-8?q?=E8=BD=AE=E6=AF=82=E5=B0=BA=E5=AF=B8=E9=80=89=E6=8B=A9=E8=BD=AE?= =?UTF-8?q?=E6=AF=82=E4=B8=AD=E9=97=B4=E6=8A=A0=E5=9B=BE=E9=83=A8=E5=88=86?= =?UTF-8?q?=E5=B0=BA=E5=AF=B8=E7=9A=84=E5=A4=A7=E5=B0=8F2=E3=80=81?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=E6=8E=89=E6=A3=80=E6=B5=8B=E8=BD=AF=E4=BB=B6?= =?UTF-8?q?=E7=94=9F=E6=88=90dump=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ImageCompare/ImageCompareModel.cpp | 79 ++++++++++++++++++++++---- tpvs17/Enchanter/main.cpp | 3 +- tpvs17/tpMain/lpMainWin.cpp | 6 +- 3 files changed, 72 insertions(+), 16 deletions(-) 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"