|
|
|
|
@ -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<Mat> 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<Mat> 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<Mat>& 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<Mat>& 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<Mat> scaledCenterVec;
|
|
|
|
|
@ -839,13 +766,7 @@ void ImageCompareModel::train(const vector<Mat>& 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<Mat>& imgVec)
|
|
|
|
|
{
|
|
|
|
|
mDisThre = DBL_MAX;
|
|
|
|
|
@ -1426,7 +1342,6 @@ ImageCompareModel* ImageCompareModel::scale(float s)
|
|
|
|
|
//
|
|
|
|
|
// pRet->set8uMaskImg(mask8uImg);
|
|
|
|
|
// pRet->set32fMaskImg(mask32fImg);
|
|
|
|
|
|
|
|
|
|
return pRet;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|