diff --git a/src/ImageCompare/ImageCompareModel.cpp b/src/ImageCompare/ImageCompareModel.cpp index 6682f39..7c27d53 100644 --- a/src/ImageCompare/ImageCompareModel.cpp +++ b/src/ImageCompare/ImageCompareModel.cpp @@ -295,101 +295,106 @@ bool ImageCompareModel::save2file(string filePath) bool ImageCompareModel::readFromFile(string filePath) { - FileStorage fs(filePath, FileStorage::READ); - if (!fs.isOpened()) - { - return false; - } + try{ + FileStorage fs(filePath, FileStorage::READ); + if (!fs.isOpened()) + { + return false; + } - fs[IMGCMP_STR_ALIGN_BASE_IMAGE] >> mAlignBaseImg; - fs[IMGCMP_STR_COMPARE_BASE_IMAGE] >> mCompareBaseImg; - fs[IMGCMP_STR_WEIGHT_MAT] >> mWeightMat; - fs[IMGCMP_STR_INSIDE_AVE_IMAGE] >> mInSideBaseImg; - fs[IMGCMP_STR_INSIDE_COMP_AVE_IMAGE] >> mInsideCompareBaseImg; - fs[IMGCMP_STR_INSIDE_WEIGHT] >> mInsideWeightMat; - fs[IMGCMP_STR_INSIDE_TEMPL] >> innerTempl; - mMatchValScale = (double)fs[IMGCMP_STR_MATCH_VAL_SCALE]; - - FileNode fn = fs[IMGCMP_STR_TARGET_MEAN_VAL]; - if (!fn.empty()) - { - mTargetMeanVal = (int)fn; - } + fs[IMGCMP_STR_ALIGN_BASE_IMAGE] >> mAlignBaseImg; + fs[IMGCMP_STR_COMPARE_BASE_IMAGE] >> mCompareBaseImg; + fs[IMGCMP_STR_WEIGHT_MAT] >> mWeightMat; + fs[IMGCMP_STR_INSIDE_AVE_IMAGE] >> mInSideBaseImg; + fs[IMGCMP_STR_INSIDE_COMP_AVE_IMAGE] >> mInsideCompareBaseImg; + fs[IMGCMP_STR_INSIDE_WEIGHT] >> mInsideWeightMat; + fs[IMGCMP_STR_INSIDE_TEMPL] >> innerTempl; + mMatchValScale = (double)fs[IMGCMP_STR_MATCH_VAL_SCALE]; + + FileNode fn = fs[IMGCMP_STR_TARGET_MEAN_VAL]; + if (!fn.empty()) + { + mTargetMeanVal = (int)fn; + } - fn = fs[IMGCMP_STR_TARGET_STDDEV_VAL]; - if (!fn.empty()) - { - mTargetStddevVal = (int)fn; - } + fn = fs[IMGCMP_STR_TARGET_STDDEV_VAL]; + if (!fn.empty()) + { + mTargetStddevVal = (int)fn; + } - fn = fs[IMGCMP_STR_REPEAT_NUM]; - if (!fn.empty()) - { - mRepeatNum = (int)fn; - } - else - { - //mRepeatNum = computeRepeatNum(); - } + fn = fs[IMGCMP_STR_REPEAT_NUM]; + if (!fn.empty()) + { + mRepeatNum = (int)fn; + } + else + { + //mRepeatNum = computeRepeatNum(); + } - fn = fs[IMGCMP_STR_NAME]; - if (!fn.empty()) - { - mName = (string)fn; - } + fn = fs[IMGCMP_STR_NAME]; + if (!fn.empty()) + { + mName = (string)fn; + } - fn = fs[IMGCMP_STR_TRUE_SAMPLE_DIS_MEAN]; - if (!fn.empty()) - { - mTrueSampleDisMean = (double)fn; - } - fn = fs[IMGCMP_STR_TRUE_SAMPLE_DIS_STDDEV]; - if (!fn.empty()) - { - mTrueSampleDisStddev = (double)fn; - } - fn = fs[IMGCMP_STR_TRUE_SAMPLE_DIS_MIN]; - if (!fn.empty()) - { - mTrueSampleDisMin = (double)fn; - } - fn = fs[IMGCMP_STR_TRUE_SAMPLE_DIS_MAX]; - if (!fn.empty()) - { - mTrueSampleDisMax = (double)fn; - } - fn = fs[IMGCMP_STR_FALSE_SAMPLE_MIN_DIS]; - if (!fn.empty()) - { - setFalseSampleMinDis((double)fn); - } - fn = fs[IMGCMP_STR_DIS_THRE]; - if (!fn.empty()) - { - mDisThre = (double)fn; - } + fn = fs[IMGCMP_STR_TRUE_SAMPLE_DIS_MEAN]; + if (!fn.empty()) + { + mTrueSampleDisMean = (double)fn; + } + fn = fs[IMGCMP_STR_TRUE_SAMPLE_DIS_STDDEV]; + if (!fn.empty()) + { + mTrueSampleDisStddev = (double)fn; + } + fn = fs[IMGCMP_STR_TRUE_SAMPLE_DIS_MIN]; + if (!fn.empty()) + { + mTrueSampleDisMin = (double)fn; + } + fn = fs[IMGCMP_STR_TRUE_SAMPLE_DIS_MAX]; + if (!fn.empty()) + { + mTrueSampleDisMax = (double)fn; + } + fn = fs[IMGCMP_STR_FALSE_SAMPLE_MIN_DIS]; + if (!fn.empty()) + { + setFalseSampleMinDis((double)fn); + } + fn = fs[IMGCMP_STR_DIS_THRE]; + if (!fn.empty()) + { + mDisThre = (double)fn; + } - fn = fs[IMGCMP_STR_AVER_DIAMETER]; - if (!fn.empty()) - { - meanDiameter = (int)fn; - } + fn = fs[IMGCMP_STR_AVER_DIAMETER]; + if (!fn.empty()) + { + meanDiameter = (int)fn; + } - fn = fs[IMGCMP_STR_INSIDE_RADIUS]; - if (!fn.empty()) - { - rInner = (float)fn; - } - fn = fs[IMGCMP_STR_INSIDE_CIRCLE_NUM]; - if (!fn.empty()) - { - mInnerCircleNum = (double)fn; - } - setFilePath(filePath); + fn = fs[IMGCMP_STR_INSIDE_RADIUS]; + if (!fn.empty()) + { + rInner = (float)fn; + } + fn = fs[IMGCMP_STR_INSIDE_CIRCLE_NUM]; + if (!fn.empty()) + { + mInnerCircleNum = (double)fn; + } + setFilePath(filePath); - genMask(); + genMask(); - return true; + return true; + } + catch (std::exception &e) { + return false; + } } void ImageCompareModel::preProcessImage(Mat& img, Mat &insideImg) const @@ -520,34 +525,6 @@ double ImageCompareModel::compare(Mat srcImage, Mat* pRImg /*= NULL*/, int level return cacheIter->second; } } -/* CircleDetector cd; - cd.setAlgoType(CircleDetector::PeakCircle); - cd.setEdgeWidth(3); - //cd.setPolarity(Polarity::White2Black); - cd.setPolarity(Polarity::Either); - cd.setFindBy(FindBy::Best); - //cd.setFindBy(FindBy::Last); - cd.setRadii(MIN_CIRCLE_RADII, MAX_CIRCLE_RADII); - cd.setACThres(5); - Vec3f bestCircle; - cd.detectBest(srcImage, Point2f(srcImage.cols / 2, srcImage.rows / 2), bestCircle, nullptr); - -#ifdef DEBUG_VIEW_INTERNAL_MAT - vector vecs; - vecs.push_back(srcImage); - vecs.push_back(srcImage); - vecs.push_back(srcImage); - Mat rr; - merge(vecs, rr); - - circle(rr, Point2f(bestCircle[0], bestCircle[1]), bestCircle[2], Scalar(255, 0, 0), 2); -#endif - - if (bestCircle[2] < 3 || bestCircle[0] == 0 || bestCircle[1] == 0) - return DBL_MAX; - */ -// int x_Axis = bestCircle[0] - MAX_CIRCLE_RADII; -// int y_Axis = bestCircle[1] - MAX_CIRCLE_RADII; int x_Axis = srcImage.cols / 2 - MAX_CIRCLE_RADII; int y_Axis = srcImage.rows / 2 - MAX_CIRCLE_RADII; @@ -560,8 +537,6 @@ double ImageCompareModel::compare(Mat srcImage, Mat* pRImg /*= NULL*/, int level return DBL_MAX; if (r_Axis >= srcImage.cols || r_Axis >= srcImage.rows) return DBL_MAX; -// if (srcImage.cols < (bestCircle[0] + MAX_CIRCLE_RADII) || srcImage.rows < (bestCircle[1] + 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; @@ -635,29 +610,7 @@ double ImageCompareModel::compare(Mat srcImage, Mat* pRImg /*= NULL*/, int level Mat camInsideMat = rotateImage(centerMat, Point2f(centerMat.cols / 2.0, centerMat.rows / 2.0), bestInsideAngle); -// float offset = 5; -// float startX = mAlignBaseImg.cols / 2.0 - rInner - offset; -// float startY = mAlignBaseImg.rows / 2.0 - rInner - offset; -// Rect rect(startX, startY, 2*(rInner + offset), 2*(rInner + offset)); -// Mat innerPartMat = camInsideMat(rect); -// Mat rstMat; -// cv::matchTemplate(innerTempl, innerPartMat, rstMat, CV_TM_SQDIFF_NORMED); -// double minVal; -// Point minLoc; -// minMaxLoc(rstMat, &minVal, NULL, &minLoc, NULL); -//#ifdef DEBUG_VIEW_INTERNAL_MAT -// Mat test1 = innerPartMat.clone(); -// Mat test2 = innerPartMat.clone(); -// vector imgs; -// imgs.push_back(test2); -// imgs.push_back(test1); -// imgs.push_back(innerPartMat); -// Mat rst; -// merge(imgs, rst); -// cv::rectangle(rst, Rect(minLoc.x, minLoc.y, innerTempl.cols, innerTempl.rows), Scalar(0, 0, 255)); -//#endif -// //debug -// + Mat highLightInsideMask = camInsideMat < mHighlightsThreshold; converToType(highLightInsideMask, CV_32FC1); highLightInsideMask /= 255.0; @@ -766,20 +719,7 @@ void ImageCompareModel::train(const vector& vec) #endif // DEBUG_VIEW_INTERNAL_MAT //bob edit -// if (bestCircle[2] > 0.00000001) -// { -// float startX = bestCircle[0] - MAX_CIRCLE_RADII;//找最大圆外径,固定直径 -// float startY = bestCircle[1] - MAX_CIRCLE_RADII; -// Rect rect(startX, startY, MAX_CIRCLE_RADII * 2, MAX_CIRCLE_RADII * 2); -// Mat origianlCenterMat; -// originalMat(rect).copyTo(origianlCenterMat); -// centerMatVec.push_back(origianlCenterMat); -// tmpVec.push_back(vec[i]); -// } -// else -// { -// int a = 0; -// } + 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); @@ -812,19 +752,6 @@ void ImageCompareModel::train(const vector& vec) /*bob end edit*/ -// if (bestCircle[2] > 0.00000001) -// { -// float startX = bestCircle[0] - bestCircle[2]; -// float startY = bestCircle[1] - bestCircle[2]; -// Rect rect(startX, startY, bestCircle[2]*2, bestCircle[2]*2); -// Mat origianlCenterMat; -// originalMat(rect).copyTo(origianlCenterMat); -// centerMatVec.push_back(origianlCenterMat); -// } -// else -// { -// -// } } mInnerCircleNum = insideCircleNumSum / vecSize; vector scaledCenterVec; @@ -839,13 +766,7 @@ void ImageCompareModel::train(const vector& vec) mAlignBaseImg = imgVec.front(); mInSideBaseImg = scaledCenterVec.front(); genMask(); - //Mat baseTempl = imgVec.front(); - //float realR = rInner + 2; - //float hf_width = sqrt(realR*realR / 2.0); - //float startx = baseTempl.cols / 2 - hf_width; - //float starty = baseTempl.rows / 2 - hf_width; - //Rect rect(startx, starty, 2*hf_width, 2*hf_width); - //innerTempl = baseTempl(rect); + preProcessImage(mAlignBaseImg, mInSideBaseImg);//预处理 光照均衡 Mat sumOutsideMat = Mat::zeros(mAlignBaseImg.size(), CV_32FC1); Mat sumInsideMat = Mat::zeros(mInSideBaseImg.size(), CV_32FC1); @@ -1107,10 +1028,6 @@ void ImageCompareModel::weightMapping(const Mat& mData, double maxVal, const Mat double affineCoeff = descendFunction(pixVal, maxVal); pWeight[j] *= affineCoeff; } - - - - } } @@ -1138,7 +1055,6 @@ double ImageCompareModel::descendFunction(double pixVal, double maxVal) //return -1 * pow(pixVal, 2) + 1; } - void ImageCompareModel::calculateAllParams(const vector& imgVec) { mDisThre = DBL_MAX; @@ -1426,7 +1342,6 @@ ImageCompareModel* ImageCompareModel::scale(float s) // // pRet->set8uMaskImg(mask8uImg); // pRet->set32fMaskImg(mask32fImg); - return pRet; }