|
|
|
|
@ -1,4 +1,4 @@
|
|
|
|
|
/*! \file ImageCompareModel.cpp
|
|
|
|
|
/*! \file ImageCompareModel.cpp
|
|
|
|
|
|
|
|
|
|
Copyright (C) 2014 Hangzhou Leaper.
|
|
|
|
|
|
|
|
|
|
@ -12,30 +12,30 @@
|
|
|
|
|
#include <fstream>
|
|
|
|
|
#include <iostream>
|
|
|
|
|
//#define DEBUG_VIEW_INTERNAL_MAT
|
|
|
|
|
#define IMGCMP_STR_NAME "name"
|
|
|
|
|
#define IMGCMP_STR_IMAGE_COMPARE_MODEL "imageCompareModel"
|
|
|
|
|
#define IMGCMP_STR_ALIGN_BASE_IMAGE "alignBaseImage"
|
|
|
|
|
#define IMGCMP_STR_COMPARE_BASE_IMAGE "compareBaseImage"
|
|
|
|
|
#define IMGCMP_STR_WEIGHT_MAT "weightMat"
|
|
|
|
|
#define IMGCMP_STR_MATCH_VAL_SCALE "matchValScale"
|
|
|
|
|
#define IMGCMP_STR_TARGET_MEAN_VAL "targetMeanVal"
|
|
|
|
|
#define IMGCMP_STR_TARGET_STDDEV_VAL "targetStddevVal"
|
|
|
|
|
#define IMGCMP_STR_REPEAT_NUM "repeatNum"
|
|
|
|
|
#define IMGCMP_STR_NAME "name"
|
|
|
|
|
#define IMGCMP_STR_IMAGE_COMPARE_MODEL "imageCompareModel"
|
|
|
|
|
#define IMGCMP_STR_ALIGN_BASE_IMAGE "alignBaseImage"
|
|
|
|
|
#define IMGCMP_STR_COMPARE_BASE_IMAGE "compareBaseImage"
|
|
|
|
|
#define IMGCMP_STR_WEIGHT_MAT "weightMat"
|
|
|
|
|
#define IMGCMP_STR_MATCH_VAL_SCALE "matchValScale"
|
|
|
|
|
#define IMGCMP_STR_TARGET_MEAN_VAL "targetMeanVal"
|
|
|
|
|
#define IMGCMP_STR_TARGET_STDDEV_VAL "targetStddevVal"
|
|
|
|
|
#define IMGCMP_STR_REPEAT_NUM "repeatNum"
|
|
|
|
|
#define IMGCMP_STR_TRUE_SAMPLE_DIS_MEAN "trueSampleDisMean"
|
|
|
|
|
#define IMGCMP_STR_TRUE_SAMPLE_DIS_STDDEV "trueSampleDisStddev"
|
|
|
|
|
#define IMGCMP_STR_TRUE_SAMPLE_DIS_MIN "trueSampleDisMin"
|
|
|
|
|
#define IMGCMP_STR_TRUE_SAMPLE_DIS_MAX "trueSampleDisMax"
|
|
|
|
|
#define IMGCMP_STR_DIS_THRE "disThre"
|
|
|
|
|
#define IMGCMP_STR_TRUE_SAMPLE_DIS_MIN "trueSampleDisMin"
|
|
|
|
|
#define IMGCMP_STR_TRUE_SAMPLE_DIS_MAX "trueSampleDisMax"
|
|
|
|
|
#define IMGCMP_STR_DIS_THRE "disThre"
|
|
|
|
|
#define IMGCMP_STR_FALSE_SAMPLE_MIN_DIS "falseSampleMinDis"
|
|
|
|
|
#define IMGCMP_STR_TRAIN_DIS "trainDis"
|
|
|
|
|
#define IMGCMP_STR_SMALLEST_MATCH_DIS "falseMinDis"
|
|
|
|
|
#define IMGCMP_STR_AVER_DIAMETER "averageDiameter"
|
|
|
|
|
#define IMGCMP_STR_INSIDE_WEIGHT "insideWeightimage"
|
|
|
|
|
#define IMGCMP_STR_INSIDE_AVE_IMAGE "insideBaseimage"
|
|
|
|
|
#define IMGCMP_STR_TRAIN_DIS "trainDis"
|
|
|
|
|
#define IMGCMP_STR_SMALLEST_MATCH_DIS "falseMinDis"
|
|
|
|
|
#define IMGCMP_STR_AVER_DIAMETER "averageDiameter"
|
|
|
|
|
#define IMGCMP_STR_INSIDE_WEIGHT "insideWeightimage"
|
|
|
|
|
#define IMGCMP_STR_INSIDE_AVE_IMAGE "insideBaseimage"
|
|
|
|
|
#define IMGCMP_STR_INSIDE_COMP_AVE_IMAGE "insideCompareBaseImage"
|
|
|
|
|
#define IMGCMP_STR_INSIDE_RADIUS "insideRadius"
|
|
|
|
|
#define IMGCMP_STR_INSIDE_RADIUS "insideRadius"
|
|
|
|
|
#define IMGCMP_STR_INSIDE_TEMPL "innerTempl"
|
|
|
|
|
#define IMGCMP_STR_INSIDE_CIRCLE_NUM "insideCircleNum" // the number of circle
|
|
|
|
|
#define IMGCMP_STR_INSIDE_CIRCLE_NUM "insideCircleNum" // the number of circle
|
|
|
|
|
|
|
|
|
|
#define IMGCMP_CACHE_MAX_SIZE 100
|
|
|
|
|
|
|
|
|
|
@ -56,10 +56,7 @@ cv::Point2f ImageCompareModel::refineCircleCen(const Mat& img, Point2f cen)
|
|
|
|
|
{
|
|
|
|
|
for (float x = cen.x - r; x <= cen.x + r; x += 0.5)
|
|
|
|
|
{
|
|
|
|
|
std::cout << "newCenter: " << x << "-" << y << ", ";
|
|
|
|
|
|
|
|
|
|
Point2f newCenter(x, y);
|
|
|
|
|
|
|
|
|
|
vector<float> vec;
|
|
|
|
|
selfRotationSimilarityFeature(img, vec, newCenter);
|
|
|
|
|
|
|
|
|
|
@ -73,7 +70,6 @@ cv::Point2f ImageCompareModel::refineCircleCen(const Mat& img, Point2f cen)
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
float diffVal = sum<float>(vec.begin(), vec.end());
|
|
|
|
|
|
|
|
|
|
vec.push_back(diffVal);
|
|
|
|
|
|
|
|
|
|
if (minDiff > diffVal)
|
|
|
|
|
@ -82,11 +78,6 @@ cv::Point2f ImageCompareModel::refineCircleCen(const Mat& img, Point2f cen)
|
|
|
|
|
bestCenter = newCenter;
|
|
|
|
|
bestDftVec = dftVec;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::cout << "diff: " << diffVal << ", "
|
|
|
|
|
" minDiff: " << minDiff << ", "
|
|
|
|
|
" bestCenter: " << bestCenter.x << "-" << bestCenter.y <<
|
|
|
|
|
std::endl;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -153,20 +144,19 @@ void ImageCompareModel::selfRotationSimilarityFeature(
|
|
|
|
|
fImg = fImg.mul(weightImg);
|
|
|
|
|
|
|
|
|
|
double sumVal = sum(weightImg).val[0];
|
|
|
|
|
|
|
|
|
|
Mat baseImg;
|
|
|
|
|
{
|
|
|
|
|
Mat t = getRotationMatrix2D(center, 1.0, 1.0);
|
|
|
|
|
Mat rImg;
|
|
|
|
|
warpAffine(fImg, rImg, t, fImg.size(), CV_INTER_CUBIC);
|
|
|
|
|
t = getRotationMatrix2D(center, -1.0, 1.0);
|
|
|
|
|
warpAffine(rImg, baseImg, t, rImg.size(), CV_INTER_CUBIC);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Mat t = getRotationMatrix2D(center, 1.0, 1.0);
|
|
|
|
|
Mat rImg;
|
|
|
|
|
warpAffine(fImg, rImg, t, fImg.size(), CV_INTER_CUBIC);
|
|
|
|
|
t = getRotationMatrix2D(center, -1.0, 1.0);
|
|
|
|
|
warpAffine(rImg, baseImg, t, rImg.size(), CV_INTER_CUBIC);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUG_VIEW_INTERNAL_MAT
|
|
|
|
|
Mat viewBaseImg = baseImg / 255.0/25.0;
|
|
|
|
|
Mat viewfImg = fImg / 255.0/25.0;
|
|
|
|
|
#endif
|
|
|
|
|
// #ifdef DEBUG_VIEW_INTERNAL_MAT
|
|
|
|
|
// Mat viewBaseImg = baseImg / 255.0/25.0;
|
|
|
|
|
// Mat viewfImg = fImg / 255.0/25.0;
|
|
|
|
|
// #endif
|
|
|
|
|
|
|
|
|
|
for (float a = 0; a <= 360.0; a += angleStep)
|
|
|
|
|
{
|
|
|
|
|
@ -211,11 +201,9 @@ cv::Mat ImageCompareModel::genMask(const Mat& img, Point2f center,
|
|
|
|
|
void ImageCompareModel::genMask()
|
|
|
|
|
{
|
|
|
|
|
m32fMaskImg = genMask(mAlignBaseImg, Point2f(mAlignBaseImg.cols / 2.0, mAlignBaseImg.rows / 2.0));
|
|
|
|
|
m8uMaskImg = genMask(mAlignBaseImg, Point2f(mAlignBaseImg.cols / 2.0, mAlignBaseImg.rows / 2.0),
|
|
|
|
|
-1.0, -1.0, CV_8UC1);
|
|
|
|
|
m8uMaskImg = genMask(mAlignBaseImg, Point2f(mAlignBaseImg.cols / 2.0, mAlignBaseImg.rows / 2.0), -1.0, -1.0, CV_8UC1);
|
|
|
|
|
m32fInsideMaskImg = genInsideMask(mInSideBaseImg, Point2f(mInSideBaseImg.cols / 2.0, mInSideBaseImg.rows / 2.0));
|
|
|
|
|
m8uInsideMaskImg = genInsideMask(mInSideBaseImg, Point2f(mInSideBaseImg.cols / 2.0, mInSideBaseImg.rows / 2.0),
|
|
|
|
|
-1.0, -1.0, CV_8UC1);
|
|
|
|
|
m8uInsideMaskImg = genInsideMask(mInSideBaseImg, Point2f(mInSideBaseImg.cols / 2.0, mInSideBaseImg.rows / 2.0), -1.0, -1.0, CV_8UC1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ImageCompareModel::printInfo()
|
|
|
|
|
@ -397,6 +385,7 @@ bool ImageCompareModel::readFromFile(string filePath)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//图像预处理
|
|
|
|
|
void ImageCompareModel::preProcessImage(Mat& img, Mat &insideImg) const
|
|
|
|
|
{
|
|
|
|
|
preProcessImage(img, m8uMaskImg, mTargetMeanVal, mTargetStddevVal, mHighlightsThreshold);
|
|
|
|
|
@ -407,8 +396,7 @@ void ImageCompareModel::preProcessImage(Mat& img, Mat &insideImg) const
|
|
|
|
|
preProcessImage(insideImg, m8uInsideMaskImg, mTargetMeanVal, mTargetStddevVal, mHighlightsThreshold);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ImageCompareModel::preProcessImage(Mat& img, const Mat& mask, double tarMean,
|
|
|
|
|
double tarStddev, int highlightsThreshold) const
|
|
|
|
|
void ImageCompareModel::preProcessImage(Mat& img, const Mat& mask, double tarMean, double tarStddev, int highlightsThreshold) const
|
|
|
|
|
{
|
|
|
|
|
if (img.channels() > 1)
|
|
|
|
|
{
|
|
|
|
|
@ -418,33 +406,32 @@ void ImageCompareModel::preProcessImage(Mat& img, const Mat& mask, double tarMea
|
|
|
|
|
{
|
|
|
|
|
converToType(img, CV_32FC1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//高斯模糊 处理噪点
|
|
|
|
|
Mat gaussImg;
|
|
|
|
|
GaussianBlur(img, gaussImg, Size(3, 3), 5.0);
|
|
|
|
|
img = gaussImg;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//膨胀 扩大掩膜模板
|
|
|
|
|
Mat dilatedMask;
|
|
|
|
|
dilate(mask, dilatedMask, Mat::ones(Size(3, 3), CV_32FC1));
|
|
|
|
|
Mat kernel = Mat::ones(Size(3, 3), CV_8UC1);
|
|
|
|
|
dilate(mask, dilatedMask, kernel);
|
|
|
|
|
|
|
|
|
|
Mat hightlightsMask = img < highlightsThreshold;
|
|
|
|
|
Mat imgMask = hightlightsMask & dilatedMask;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//计算图像像素均值 对检测图像做均衡
|
|
|
|
|
Scalar meanScalar, stddevScalar;
|
|
|
|
|
meanStdDev(img, meanScalar, stddevScalar, imgMask);
|
|
|
|
|
img = (img - meanScalar.val[0]) * tarStddev / stddevScalar.val[0] + tarMean;
|
|
|
|
|
|
|
|
|
|
//归一化处理图像 减少图像间差异
|
|
|
|
|
converToType(imgMask, CV_32FC1);
|
|
|
|
|
imgMask /= 255.0;
|
|
|
|
|
Mat imgNorm = cocentricNorm(img, Point2f(img.cols / 2.0, img.rows / 2.0),
|
|
|
|
|
imgMask, 125);
|
|
|
|
|
#ifdef DEBUG_VIEW_INTERNAL_MAT
|
|
|
|
|
Mat vImgNorm = imgNorm / 255.0;
|
|
|
|
|
#endif
|
|
|
|
|
Mat imgNorm = cocentricNorm(img, Point2f(img.cols / 2.0, img.rows / 2.0), imgMask, 125);
|
|
|
|
|
img = imgNorm;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ImageCompareModel::preProcessImage(Mat& img, const Mat& mask,
|
|
|
|
|
const Mat& weightMat, double dstMean, double dstStddev, int highlightsThreshold) const
|
|
|
|
|
void ImageCompareModel::preProcessImage(Mat& img, const Mat& mask, const Mat& weightMat, double dstMean, double dstStddev, int highlightsThreshold) const
|
|
|
|
|
{
|
|
|
|
|
if (img.channels() > 1)
|
|
|
|
|
{
|
|
|
|
|
@ -465,20 +452,11 @@ void ImageCompareModel::preProcessImage(Mat& img, const Mat& mask,
|
|
|
|
|
Scalar meanScalar, stddevScalar;
|
|
|
|
|
meanStdDev(img, meanScalar, stddevScalar, imgMask);
|
|
|
|
|
img = (img - meanScalar.val[0]) * dstStddev / stddevScalar.val[0] + dstMean;
|
|
|
|
|
//img.setTo(0, img < 0);
|
|
|
|
|
converToType(hightlightsMask, CV_32FC1);
|
|
|
|
|
//converToType(imgMask, CV_32FC1);
|
|
|
|
|
Mat imgNorm = cocentricNorm(img, Point2f(img.cols / 2.0, img.rows / 2.0),
|
|
|
|
|
weightMat.mul(hightlightsMask), 125);
|
|
|
|
|
#ifdef DEBUG_VIEW_INTERNAL_MAT
|
|
|
|
|
Mat vImgNorm = imgNorm / 255.0;
|
|
|
|
|
#endif
|
|
|
|
|
img = imgNorm;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ImageCompareModel::preProcessImage0(Mat& img) const
|
|
|
|
|
{
|
|
|
|
|
converToType(hightlightsMask, CV_32FC1);
|
|
|
|
|
|
|
|
|
|
Mat imgNorm = cocentricNorm(img, Point2f(img.cols / 2.0, img.rows / 2.0), weightMat.mul(hightlightsMask), 125);
|
|
|
|
|
img = imgNorm;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double ImageCompareModel::compare(Mat img0, Mat img1, Mat* pRImg0, Mat* pRImg1)
|
|
|
|
|
@ -492,7 +470,6 @@ double ImageCompareModel::compare(Mat img0, Mat img1, Mat* pRImg0, Mat* pRImg1)
|
|
|
|
|
int bestAngle = -1;
|
|
|
|
|
Mat bestImg1;
|
|
|
|
|
double bestDD = 0;
|
|
|
|
|
|
|
|
|
|
double w = 0;
|
|
|
|
|
|
|
|
|
|
Point2f center((float)img1.cols / 2.0, (float)img1.rows / 2.0);
|
|
|
|
|
@ -510,10 +487,9 @@ double ImageCompareModel::compare(Mat img0, Mat img1, Mat* pRImg0, Mat* pRImg1)
|
|
|
|
|
{
|
|
|
|
|
*pRImg1 = rImg1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return genMatchValue(dMat);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//匹配比较
|
|
|
|
|
double ImageCompareModel::compare(Mat srcImage, Mat* pRImg /*= NULL*/, int levelNum /*= 1*/,
|
|
|
|
|
bool isFilterSize /*= true*/, int flag, double md_diameter, double md_height)
|
|
|
|
|
{
|
|
|
|
|
@ -528,16 +504,13 @@ double ImageCompareModel::compare(Mat srcImage, Mat* pRImg /*= NULL*/, int level
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
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)
|
|
|
|
|
return DBL_MAX;
|
|
|
|
|
|
|
|
|
|
if (srcImage.cols < (srcImage.cols / 2 + MAX_CIRCLE_RADII) || srcImage.rows < (srcImage.rows / 2 + MAX_CIRCLE_RADII))
|
|
|
|
|
return DBL_MAX;
|
|
|
|
|
|
|
|
|
|
@ -548,11 +521,11 @@ double ImageCompareModel::compare(Mat srcImage, Mat* pRImg /*= NULL*/, int level
|
|
|
|
|
resizeMat(srcImage, img);
|
|
|
|
|
resizeMat(srcCenterMat, centerMat);
|
|
|
|
|
Mat rawImg = img.clone();
|
|
|
|
|
int nRadiusDiff = 15;
|
|
|
|
|
int nRadiusDiff = 15;//过滤图像尺寸和模板尺寸不匹配的动作
|
|
|
|
|
if (mAlignBaseImg.size() != img.size() || mInSideBaseImg.size() !=centerMat.size())
|
|
|
|
|
{
|
|
|
|
|
if (isFilterSize \
|
|
|
|
|
&& abs(mAlignBaseImg.size().width - img.size().width) > nRadiusDiff \
|
|
|
|
|
if (isFilterSize
|
|
|
|
|
&& abs(mAlignBaseImg.size().width - img.size().width) > nRadiusDiff
|
|
|
|
|
|| abs(mInSideBaseImg.size().width - centerMat.size().width) > 3)
|
|
|
|
|
{
|
|
|
|
|
return DBL_MAX;
|
|
|
|
|
@ -560,80 +533,58 @@ double ImageCompareModel::compare(Mat srcImage, Mat* pRImg /*= NULL*/, int level
|
|
|
|
|
resize(img, img, mAlignBaseImg.size());
|
|
|
|
|
resize(centerMat, centerMat, mInSideBaseImg.size());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Mat matchImg = img.clone();
|
|
|
|
|
Mat matchInsideImg = centerMat.clone();
|
|
|
|
|
|
|
|
|
|
preProcessImage(matchImg, matchInsideImg);
|
|
|
|
|
|
|
|
|
|
//抠出需要检测的图像
|
|
|
|
|
Mat matchImg = img.clone();//辐条部位
|
|
|
|
|
Mat matchInsideImg = centerMat.clone();//圆心部位
|
|
|
|
|
|
|
|
|
|
preProcessImage(matchImg, matchInsideImg);//图像预处理
|
|
|
|
|
// Mat s = matchImg / 255.0;
|
|
|
|
|
// imwrite("11.png", s);
|
|
|
|
|
if (!mpMultiScaleModel)
|
|
|
|
|
{
|
|
|
|
|
initMultiScaleModel();
|
|
|
|
|
}
|
|
|
|
|
m_parallelFlag = 0;
|
|
|
|
|
RotateMatchResult rmr = rotateMatch(matchImg, levelNum);
|
|
|
|
|
RotateMatchResult rmr = rotateMatch(matchImg, levelNum);//旋转图像,计算最佳旋转角度
|
|
|
|
|
Mat rImg = rmr.mBestRImg;
|
|
|
|
|
m_parallelFlag = 1;
|
|
|
|
|
RotateMatchResult rmmInside = rotateMatch(matchInsideImg, 1);
|
|
|
|
|
RotateMatchResult rmmInside = rotateMatch(matchInsideImg, 1);//旋转图像,计算最佳旋转角度
|
|
|
|
|
Mat rInsideImg = rmmInside.mBestRImg;
|
|
|
|
|
if (rImg.empty() || rInsideImg.empty())
|
|
|
|
|
{
|
|
|
|
|
return DBL_MAX;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUG_VIEW_INTERNAL_MAT
|
|
|
|
|
Mat vRImg = rImg / 255.0;
|
|
|
|
|
Mat vInsideMat = rInsideImg / 255.0;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
double bestAngle = rmr.mBestAngle;
|
|
|
|
|
Mat cmpImg = rotateImage(img, Point2f(img.cols / 2.0, img.rows / 2.0),
|
|
|
|
|
bestAngle);
|
|
|
|
|
Mat cmpImg = rotateImage(img, Point2f(img.cols / 2.0, img.rows / 2.0), bestAngle);//旋转图像
|
|
|
|
|
|
|
|
|
|
// remove highlights
|
|
|
|
|
// remove highlights 去除高光影响
|
|
|
|
|
Mat hightlightsMask = cmpImg < mHighlightsThreshold;
|
|
|
|
|
converToType(hightlightsMask, CV_32FC1);
|
|
|
|
|
hightlightsMask /= 255.0;
|
|
|
|
|
|
|
|
|
|
Mat unifiedMask = m32fMaskImg.mul(hightlightsMask).mul(mWeightMat);
|
|
|
|
|
//Mat ii = mWeightMat / 255.0;
|
|
|
|
|
preProcessImage(cmpImg, m8uMaskImg, mWeightMat, mTargetMeanVal,
|
|
|
|
|
mTargetStddevVal, mHighlightsThreshold);
|
|
|
|
|
preProcessImage(cmpImg, m8uMaskImg, mWeightMat, mTargetMeanVal, mTargetStddevVal, mHighlightsThreshold);
|
|
|
|
|
|
|
|
|
|
cmpImg.setTo(0, cmpImg < 0);
|
|
|
|
|
|
|
|
|
|
converToType(cmpImg, CV_32FC1);
|
|
|
|
|
normSectors_tarImg(cmpImg, unifiedMask, imgCen(cmpImg), 1,
|
|
|
|
|
mCompareBaseImg);
|
|
|
|
|
normSectors_tarImg(cmpImg, unifiedMask, imgCen(cmpImg), 1, mCompareBaseImg);
|
|
|
|
|
|
|
|
|
|
double bestInsideAngle = rmmInside.mBestAngle;
|
|
|
|
|
Mat camInsideMat = rotateImage(centerMat, Point2f(centerMat.cols / 2.0, centerMat.rows / 2.0),
|
|
|
|
|
bestInsideAngle);
|
|
|
|
|
|
|
|
|
|
Mat camInsideMat = rotateImage(centerMat, Point2f(centerMat.cols / 2.0, centerMat.rows / 2.0), bestInsideAngle);
|
|
|
|
|
|
|
|
|
|
Mat highLightInsideMask = camInsideMat < mHighlightsThreshold;
|
|
|
|
|
converToType(highLightInsideMask, CV_32FC1);
|
|
|
|
|
highLightInsideMask /= 255.0;
|
|
|
|
|
Mat unifiedInsideMask = m32fInsideMaskImg.mul(highLightInsideMask).mul(mInsideWeightMat);
|
|
|
|
|
preProcessImage(camInsideMat, m8uInsideMaskImg, mInsideWeightMat, mTargetMeanVal,
|
|
|
|
|
mTargetStddevVal, mHighlightsThreshold);
|
|
|
|
|
preProcessImage(camInsideMat, m8uInsideMaskImg, mInsideWeightMat, mTargetMeanVal, mTargetStddevVal, mHighlightsThreshold);
|
|
|
|
|
Mat vcamInside = camInsideMat / 255.0;
|
|
|
|
|
camInsideMat.setTo(0, camInsideMat < 0);
|
|
|
|
|
//mInsideCompareBaseImg.setTo(0, mInsideCompareBaseImg < 0);
|
|
|
|
|
normSectors_tarImg(camInsideMat, unifiedInsideMask, imgCen(camInsideMat), 1, mInsideCompareBaseImg);
|
|
|
|
|
//
|
|
|
|
|
mInsideCompareBaseImg.setTo(0, mInsideCompareBaseImg < 0);
|
|
|
|
|
#ifdef DEBUG_VIEW_INTERNAL_MAT
|
|
|
|
|
Mat vRotatedImg0 = cmpImg / 255.0;
|
|
|
|
|
Mat vrotatedInsideImage = camInsideMat / 255.0;
|
|
|
|
|
cv::imwrite("F:\\temp\\insideAfterSector.png", camInsideMat);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUG_VIEW_INTERNAL_MAT
|
|
|
|
|
Mat vRotatedImg1 = mCompareBaseImg / 255.0;
|
|
|
|
|
Mat vrotatedInsideBase = mInsideCompareBaseImg / 255.0;
|
|
|
|
|
cv::imwrite("F:\\temp\\insideAfterSectorCompareBase.png", mInsideCompareBaseImg);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
cmpImg.setTo(0, cmpImg < 10);
|
|
|
|
|
//camInsideMat.setTo(0, camInsideMat < 10);
|
|
|
|
|
@ -642,10 +593,14 @@ double ImageCompareModel::compare(Mat srcImage, Mat* pRImg /*= NULL*/, int level
|
|
|
|
|
*pRImg = cmpImg;
|
|
|
|
|
}
|
|
|
|
|
m_parallelFlag = 0;
|
|
|
|
|
double ret = genMatchValue(cmpImg, mCompareBaseImg, unifiedMask, flag, rawImg.rows, md_diameter, md_height);//得出相似值
|
|
|
|
|
Mat s1 = cmpImg / 255.0;
|
|
|
|
|
Mat s2 = mCompareBaseImg / 255.0;
|
|
|
|
|
Mat s3 = unifiedMask / 255.0;
|
|
|
|
|
Mat s4 = rawImg / 255.0;
|
|
|
|
|
double ret = genMatchValue(cmpImg, mCompareBaseImg, unifiedMask, flag, rawImg.rows, md_diameter, md_height);//得出相似值
|
|
|
|
|
|
|
|
|
|
m_parallelFlag = 1;
|
|
|
|
|
double retInside = genMatchValue(camInsideMat, mInsideCompareBaseImg, unifiedInsideMask, 0, rawImg.rows, md_diameter, md_height);//得出相似值
|
|
|
|
|
double retInside = genMatchValue(camInsideMat, mInsideCompareBaseImg, unifiedInsideMask, 0, rawImg.rows, md_diameter, md_height);//得出相似值
|
|
|
|
|
|
|
|
|
|
ret = 0.6*ret + 0.4*retInside;
|
|
|
|
|
|
|
|
|
|
@ -695,32 +650,32 @@ void ImageCompareModel::train(const vector<Mat>& vec)
|
|
|
|
|
Vec3f bestCircle;
|
|
|
|
|
Point2f p = Point2f(originalMat.cols / 2.0, originalMat.rows / 2.0);
|
|
|
|
|
// cd.detectBest(originalMat, Point2f(originalMat.cols / 2.0, originalMat.rows / 2.0), bestCircle, nullptr);
|
|
|
|
|
#ifdef DEBUG_VIEW_INTERNAL_MAT
|
|
|
|
|
Mat img1 = vec.front().clone();
|
|
|
|
|
Mat img2 = vec.front().clone();
|
|
|
|
|
vector<Mat> vecs;
|
|
|
|
|
vecs.push_back(originalMat);
|
|
|
|
|
vecs.push_back(originalMat);
|
|
|
|
|
vecs.push_back(originalMat);
|
|
|
|
|
Mat rr;
|
|
|
|
|
merge(vecs, rr);
|
|
|
|
|
|
|
|
|
|
circle(rr, Point2f(bestCircle[0], bestCircle[1]), bestCircle[2], Scalar(255, 0, 0), 2);
|
|
|
|
|
vector<Mat> imgVec;
|
|
|
|
|
resizeVecMat(vec, imgVec);
|
|
|
|
|
vector<Mat> vecss;
|
|
|
|
|
vecss.push_back(originalMat);
|
|
|
|
|
vecss.push_back(originalMat);
|
|
|
|
|
vecss.push_back(originalMat);
|
|
|
|
|
Mat rrr;
|
|
|
|
|
merge(vecss, rrr);
|
|
|
|
|
|
|
|
|
|
// circle(rrr, Point2f(bestCircle[0] / COLS_SCALE, bestCircle[1] / COLS_SCALE), rInner, Scalar(255, 0, 0), 1);
|
|
|
|
|
#endif // DEBUG_VIEW_INTERNAL_MAT
|
|
|
|
|
// #ifdef DEBUG_VIEW_INTERNAL_MAT
|
|
|
|
|
// Mat img1 = vec.front().clone();
|
|
|
|
|
// Mat img2 = vec.front().clone();
|
|
|
|
|
// vector<Mat> vecs;
|
|
|
|
|
// vecs.push_back(originalMat);
|
|
|
|
|
// vecs.push_back(originalMat);
|
|
|
|
|
// vecs.push_back(originalMat);
|
|
|
|
|
// Mat rr;
|
|
|
|
|
// merge(vecs, rr);
|
|
|
|
|
//
|
|
|
|
|
// circle(rr, Point2f(bestCircle[0], bestCircle[1]), bestCircle[2], Scalar(255, 0, 0), 2);
|
|
|
|
|
// vector<Mat> imgVec;
|
|
|
|
|
// resizeVecMat(vec, imgVec);
|
|
|
|
|
// vector<Mat> vecss;
|
|
|
|
|
// vecss.push_back(originalMat);
|
|
|
|
|
// vecss.push_back(originalMat);
|
|
|
|
|
// vecss.push_back(originalMat);
|
|
|
|
|
// Mat rrr;
|
|
|
|
|
// merge(vecss, rrr);
|
|
|
|
|
//
|
|
|
|
|
// // circle(rrr, Point2f(bestCircle[0] / COLS_SCALE, bestCircle[1] / COLS_SCALE), rInner, Scalar(255, 0, 0), 1);
|
|
|
|
|
// #endif // DEBUG_VIEW_INTERNAL_MAT
|
|
|
|
|
|
|
|
|
|
//bob edit
|
|
|
|
|
|
|
|
|
|
float startX = originalMat.cols / 2.0 - MAX_CIRCLE_RADII;//找最大圆外径,固定直径
|
|
|
|
|
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);
|
|
|
|
|
Mat origianlCenterMat;
|
|
|
|
|
@ -767,7 +722,7 @@ void ImageCompareModel::train(const vector<Mat>& vec)
|
|
|
|
|
mInSideBaseImg = scaledCenterVec.front();
|
|
|
|
|
genMask();
|
|
|
|
|
|
|
|
|
|
preProcessImage(mAlignBaseImg, mInSideBaseImg);//预处理 光照均衡
|
|
|
|
|
preProcessImage(mAlignBaseImg, mInSideBaseImg);//预处理 光照均衡
|
|
|
|
|
Mat sumOutsideMat = Mat::zeros(mAlignBaseImg.size(), CV_32FC1);
|
|
|
|
|
Mat sumInsideMat = Mat::zeros(mInSideBaseImg.size(), CV_32FC1);
|
|
|
|
|
Mat minOutsideMat(mAlignBaseImg.size(), mAlignBaseImg.type());
|
|
|
|
|
@ -807,7 +762,7 @@ void ImageCompareModel::train(const vector<Mat>& vec)
|
|
|
|
|
//Mat insideImg = img.clone();
|
|
|
|
|
preProcessImage(img, centerMat);
|
|
|
|
|
m_parallelFlag = 0;
|
|
|
|
|
RotateMatchResult rmr = rotateMatch(img);//旋转匹配 输出匹配完成的角度及图片
|
|
|
|
|
RotateMatchResult rmr = rotateMatch(img);//旋转匹配 输出匹配完成的角度及图片
|
|
|
|
|
rmrVec.push_back(rmr);
|
|
|
|
|
m_parallelFlag = 1;
|
|
|
|
|
RotateMatchResult rmrInside = rotateMatch(centerMat);
|
|
|
|
|
@ -819,7 +774,7 @@ void ImageCompareModel::train(const vector<Mat>& vec)
|
|
|
|
|
Mat rInsideImg = rmrInside.mBestRImg;
|
|
|
|
|
rInsideImgVec.push_back(rInsideImg);
|
|
|
|
|
//minMat = min(minMat, rImg);
|
|
|
|
|
minOutsideMat = min(minOutsideMat, rImg);//生成权重图 去毛刺
|
|
|
|
|
minOutsideMat = min(minOutsideMat, rImg);//生成权重图 去毛刺
|
|
|
|
|
sumOutsideMat += rImg;
|
|
|
|
|
|
|
|
|
|
minInsideMat = min(minInsideMat, rInsideImg);
|
|
|
|
|
@ -848,14 +803,13 @@ void ImageCompareModel::train(const vector<Mat>& vec)
|
|
|
|
|
mWeightMat /= 255.0;
|
|
|
|
|
mInsideWeightMat = minInsideMat;
|
|
|
|
|
mInsideWeightMat /= 255.0;
|
|
|
|
|
/*luffy_base::luffy_imageProc::*/meanvarnorm(mWeightMat, mWeightMat,//对权重进行 归一化
|
|
|
|
|
mTargetMeanVal, 150, m8uMaskImg);
|
|
|
|
|
|
|
|
|
|
//对权重进行 归一化
|
|
|
|
|
meanvarnorm(mWeightMat, mWeightMat, mTargetMeanVal, 150, m8uMaskImg);
|
|
|
|
|
mWeightMat.setTo(0, mWeightMat < 10);
|
|
|
|
|
Scalar meanScalar, stddevScalar;
|
|
|
|
|
meanStdDev(mInsideWeightMat, meanScalar, stddevScalar, m8uInsideMaskImg);
|
|
|
|
|
mInsideWeightMat = mInsideWeightMat* (127 / meanScalar.val[0]);
|
|
|
|
|
//luffy_base::luffy_imageProc::meanvarnorm(mInsideWeightMat, mInsideWeightMat,
|
|
|
|
|
// mTargetMeanVal, 50, m8uInsideMaskImg);
|
|
|
|
|
mInsideWeightMat.setTo(0, mInsideWeightMat < 0);
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
@ -884,25 +838,22 @@ void ImageCompareModel::train(const vector<Mat>& vec)
|
|
|
|
|
{
|
|
|
|
|
double bestAngle = rmrVec[i].mBestAngle;
|
|
|
|
|
Mat img = resizedImgVec[i];
|
|
|
|
|
Mat rotatedImg = rotateImage(img, Point2f(img.cols/2.0, img.rows/2.0),
|
|
|
|
|
bestAngle);
|
|
|
|
|
Mat rotatedImg = rotateImage(img, Point2f(img.cols/2.0, img.rows/2.0), bestAngle);
|
|
|
|
|
|
|
|
|
|
preProcessImage(rotatedImg, m8uMaskImg, mWeightMat, mTargetMeanVal,
|
|
|
|
|
mTargetStddevVal, mHighlightsThreshold);
|
|
|
|
|
preProcessImage(rotatedImg, m8uMaskImg, mWeightMat, mTargetMeanVal, mTargetStddevVal, mHighlightsThreshold);
|
|
|
|
|
|
|
|
|
|
double bestInsidePart = rmrVecInside[i].mBestAngle;
|
|
|
|
|
//Mat i_Mat = resizedImgVec[i];
|
|
|
|
|
Mat centerMat = resizedCenterVec[i];
|
|
|
|
|
Mat rotatedInsideMat = rotateImage(centerMat, Point2f(centerMat.cols / 2.0, centerMat.rows / 2.0), bestInsidePart);
|
|
|
|
|
|
|
|
|
|
preProcessImage(rotatedInsideMat, m8uInsideMaskImg, mInsideWeightMat, mTargetMeanVal,
|
|
|
|
|
mTargetStddevVal, mHighlightsThreshold);
|
|
|
|
|
preProcessImage(rotatedInsideMat, m8uInsideMaskImg, mInsideWeightMat, mTargetMeanVal, mTargetStddevVal, mHighlightsThreshold);
|
|
|
|
|
|
|
|
|
|
sumOutsideMat += rotatedImg;
|
|
|
|
|
//rotatedInsideMat.setTo(0, rotatedInsideMat < 0);
|
|
|
|
|
sumInsideMat += rotatedInsideMat;
|
|
|
|
|
}
|
|
|
|
|
mCompareBaseImg = sumOutsideMat / resizedImgVec.size();//得到最终匹配图
|
|
|
|
|
mCompareBaseImg = sumOutsideMat / resizedImgVec.size();//得到最终匹配图
|
|
|
|
|
mInsideCompareBaseImg = sumInsideMat / resizedImgVec.size();
|
|
|
|
|
#ifdef DEBUG_VIEW_INTERNAL_MAT
|
|
|
|
|
Mat vCompareBaseImg = mCompareBaseImg / 255.0;
|
|
|
|
|
@ -931,8 +882,7 @@ void ImageCompareModel::trueSampleWeightRecon(const vector<Mat>& resizedVec,
|
|
|
|
|
const Mat &img = resizedVec[i];
|
|
|
|
|
double bestAngle = rmrVec[i].mBestAngle;
|
|
|
|
|
//preProcessImage(processedImg, insideMatchImg);
|
|
|
|
|
Mat rotatedImg = rotateImage(img, Point2f(img.cols / 2.0, img.rows / 2.0),
|
|
|
|
|
bestAngle);
|
|
|
|
|
Mat rotatedImg = rotateImage(img, Point2f(img.cols / 2.0, img.rows / 2.0), bestAngle);
|
|
|
|
|
|
|
|
|
|
Mat hightlightsMask = rotatedImg < mHighlightsThreshold;
|
|
|
|
|
converToType(hightlightsMask, CV_32FC1);
|
|
|
|
|
@ -940,8 +890,7 @@ void ImageCompareModel::trueSampleWeightRecon(const vector<Mat>& resizedVec,
|
|
|
|
|
|
|
|
|
|
Mat unifiedMask = m32fMaskImg.mul(hightlightsMask).mul(mWeightMat);
|
|
|
|
|
|
|
|
|
|
preProcessImage(rotatedImg, m8uMaskImg, mWeightMat, mTargetMeanVal,
|
|
|
|
|
mTargetStddevVal, mHighlightsThreshold);
|
|
|
|
|
preProcessImage(rotatedImg, m8uMaskImg, mWeightMat, mTargetMeanVal, mTargetStddevVal, mHighlightsThreshold);
|
|
|
|
|
|
|
|
|
|
rotatedImg.setTo(0, rotatedImg < 0);
|
|
|
|
|
converToType(rotatedImg, CV_32FC1);
|
|
|
|
|
@ -955,15 +904,13 @@ void ImageCompareModel::trueSampleWeightRecon(const vector<Mat>& resizedVec,
|
|
|
|
|
////// FOR INSIDE CIRCLE
|
|
|
|
|
double insideBestAngle = rmrVecInside[i].mBestAngle;
|
|
|
|
|
const Mat & centerMat = resizedCenterVec[i];
|
|
|
|
|
Mat rotatedInsideImg = rotateImage(centerMat, Point2f(centerMat.cols / 2.0, centerMat.rows / 2.0),
|
|
|
|
|
insideBestAngle);
|
|
|
|
|
Mat rotatedInsideImg = rotateImage(centerMat, Point2f(centerMat.cols / 2.0, centerMat.rows / 2.0), insideBestAngle);
|
|
|
|
|
|
|
|
|
|
Mat highLightInsideMask = rotatedInsideImg < mHighlightsThreshold;
|
|
|
|
|
converToType(highLightInsideMask, CV_32FC1);
|
|
|
|
|
highLightInsideMask /= 255.0;
|
|
|
|
|
Mat unifiedInsideMask = m32fInsideMaskImg.mul(highLightInsideMask).mul(mInsideWeightMat);
|
|
|
|
|
preProcessImage(rotatedInsideImg, m8uInsideMaskImg, mInsideWeightMat, mTargetMeanVal,
|
|
|
|
|
mTargetStddevVal, mHighlightsThreshold);
|
|
|
|
|
preProcessImage(rotatedInsideImg, m8uInsideMaskImg, mInsideWeightMat, mTargetMeanVal, mTargetStddevVal, mHighlightsThreshold);
|
|
|
|
|
Mat vcamInside = rotatedInsideImg / 255.0;
|
|
|
|
|
rotatedInsideImg.setTo(0, rotatedInsideImg < 0);
|
|
|
|
|
//mInsideCompareBaseImg.setTo(0, mInsideCompareBaseImg < 0);
|
|
|
|
|
@ -1240,7 +1187,8 @@ void ImageCompareModel::selfRotateMin(const Mat& img, Mat& weightMat, int repeat
|
|
|
|
|
{
|
|
|
|
|
Mat rotatedImg = rotateImage(img, cen, i*angleStep);
|
|
|
|
|
Mat dilatedImg;
|
|
|
|
|
dilate(rotatedImg, dilatedImg, Mat::ones(3, 3, CV_32FC1));
|
|
|
|
|
Mat kernel = Mat::ones(3, 3, CV_32FC1);
|
|
|
|
|
dilate(rotatedImg, dilatedImg, kernel);
|
|
|
|
|
dSumMat = min(dSumMat, dilatedImg);
|
|
|
|
|
}
|
|
|
|
|
weightMat = dSumMat;
|
|
|
|
|
@ -1249,31 +1197,59 @@ void ImageCompareModel::selfRotateMin(const Mat& img, Mat& weightMat, int repeat
|
|
|
|
|
double ImageCompareModel::genMatchValue(const Mat& dMat) const
|
|
|
|
|
{
|
|
|
|
|
double v = norm(dMat, NORM_L2);
|
|
|
|
|
|
|
|
|
|
double ret = scaleMatchValue(v);
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double ImageCompareModel::genMatchValue2(const Mat& rImg, const Mat& baseImg, const Mat& maskImg) const
|
|
|
|
|
{
|
|
|
|
|
Mat dMat = rImg - baseImg;
|
|
|
|
|
dMat = abs(dMat.mul(maskImg));
|
|
|
|
|
|
|
|
|
|
Mat minmaxScaleMat;
|
|
|
|
|
Mat mMask;
|
|
|
|
|
if (m_parallelFlag != 1)
|
|
|
|
|
{
|
|
|
|
|
minmaxScaleMat = minMaxNorm(dMat, 0, 255, m8uMaskImg);
|
|
|
|
|
converToType(minmaxScaleMat, CV_8UC1);
|
|
|
|
|
mMask = lowerMajorityMask(minmaxScaleMat, m8uMaskImg, 0.98);
|
|
|
|
|
// Mat dd = mMask / 255.0;
|
|
|
|
|
// Mat ddmask = m8uMaskImg / 255.0;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
minmaxScaleMat = minMaxNorm(dMat, 0, 255, m8uInsideMaskImg);
|
|
|
|
|
converToType(minmaxScaleMat, CV_8UC1);
|
|
|
|
|
mMask = lowerMajorityMask(minmaxScaleMat, m8uInsideMaskImg, 0.97);
|
|
|
|
|
}
|
|
|
|
|
converToType(mMask, CV_32FC1);
|
|
|
|
|
mMask /= 255.0;
|
|
|
|
|
|
|
|
|
|
dMat = dMat.mul(mMask);
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUG_VIEW_INTERNAL_MAT
|
|
|
|
|
Mat vDMat1 = abs(dMat) / 255.0 / 255.0;
|
|
|
|
|
#endif
|
|
|
|
|
Mat vii = mMask.mul(maskImg);
|
|
|
|
|
Mat ii = mMask.mul(maskImg) / 255.0;
|
|
|
|
|
double s = sum(mMask.mul(maskImg)).val[0];
|
|
|
|
|
double ret = genMatchValue(dMat) / s;
|
|
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double ImageCompareModel::genMatchValue(const Mat& rImg, const Mat& baseImg,
|
|
|
|
|
const Mat& maskImg, int flag, int diameter, double md_diameter, double md_height) const
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
Mat v1 = rImg / 255.0;//展示图
|
|
|
|
|
Mat v2 = baseImg / 255.0;//展示图
|
|
|
|
|
Mat v3 = maskImg / 255.0;//展示图
|
|
|
|
|
|
|
|
|
|
Mat dMat = rImg - baseImg;
|
|
|
|
|
//Mat testMask = maskImg.mul(m32fMaskImg);
|
|
|
|
|
dMat = abs(dMat.mul(maskImg));
|
|
|
|
|
//dMat = abs(dMat.mul(testMask));
|
|
|
|
|
#ifdef DEBUG_VIEW_INTERNAL_MAT
|
|
|
|
|
//Mat vRImg = rImg.mul(m32fMaskImg) / 255.0;
|
|
|
|
|
Mat vDMat0 = abs(dMat) / 255.0;
|
|
|
|
|
//Mat vBase = baseImg.mul(m32fMaskImg) / 255.0;
|
|
|
|
|
Mat vDMat = abs(dMat) / 255.0 / 255.0;
|
|
|
|
|
|
|
|
|
|
//Mat vinsideImg = rImg.mul(m32fInsideMaskImg) / 255.0;
|
|
|
|
|
//Mat vinsideBase = baseImg.mul(m32fInsideMaskImg) / 255.0;
|
|
|
|
|
|
|
|
|
|
// Mat vMask = maskImg / 255.0;
|
|
|
|
|
//Mat vMask = testMask / 255.0;
|
|
|
|
|
#endif
|
|
|
|
|
Mat dV = dMat / 255.0;
|
|
|
|
|
Mat minmaxScaleMat;
|
|
|
|
|
Mat mMask;
|
|
|
|
|
if (m_parallelFlag != 1)
|
|
|
|
|
@ -1281,37 +1257,28 @@ double ImageCompareModel::genMatchValue(const Mat& rImg, const Mat& baseImg,
|
|
|
|
|
minmaxScaleMat = minMaxNorm(dMat, 0, 255, m8uMaskImg);
|
|
|
|
|
converToType(minmaxScaleMat, CV_8UC1);
|
|
|
|
|
mMask = lowerMajorityMask(minmaxScaleMat, m8uMaskImg, 0.98);
|
|
|
|
|
printLog("myLog.txt", "finish outside mMask Part");
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
minmaxScaleMat = minMaxNorm(dMat, 0, 255, m8uInsideMaskImg);
|
|
|
|
|
converToType(minmaxScaleMat, CV_8UC1);
|
|
|
|
|
mMask = lowerMajorityMask(minmaxScaleMat, m8uInsideMaskImg, 0.97);
|
|
|
|
|
printLog("myLog.txt", "finish inside mMask Part");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
converToType(mMask, CV_32FC1);
|
|
|
|
|
mMask /= 255.0;
|
|
|
|
|
|
|
|
|
|
dMat = dMat.mul(mMask);
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUG_VIEW_INTERNAL_MAT
|
|
|
|
|
Mat vDMat1 = abs(dMat) / 255.0 / 255.0;
|
|
|
|
|
#endif
|
|
|
|
|
Mat vii = mMask.mul(maskImg);
|
|
|
|
|
Mat ii = mMask.mul(maskImg) / 255.0;
|
|
|
|
|
double s = sum(mMask.mul(maskImg)).val[0];
|
|
|
|
|
Mat sunMat = mMask.mul(maskImg);
|
|
|
|
|
// Mat ii = mMask.mul(maskImg) / 255.0;
|
|
|
|
|
double s = sum(sunMat).val[0];
|
|
|
|
|
double ret = genMatchValue(dMat) / s;
|
|
|
|
|
|
|
|
|
|
if (flag == 1)
|
|
|
|
|
{
|
|
|
|
|
double matchedVal = ret;
|
|
|
|
|
ret = penltyCoeff(matchedVal, meanDiameter, diameter, md_diameter, md_height);//做惩罚
|
|
|
|
|
printf("the matched value %f", ret);
|
|
|
|
|
ret = penltyCoeff(matchedVal, meanDiameter, diameter, md_diameter, md_height);//做惩罚
|
|
|
|
|
}
|
|
|
|
|
printLog("myLog.txt", "finish detect, return val");
|
|
|
|
|
return ret;
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double ImageCompareModel::scaleMatchValue(double val) const
|
|
|
|
|
@ -1319,7 +1286,6 @@ double ImageCompareModel::scaleMatchValue(double val) const
|
|
|
|
|
return val*mMatchValScale;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ImageCompareModel* ImageCompareModel::scale(float s)
|
|
|
|
|
{
|
|
|
|
|
Mat baseImage;
|
|
|
|
|
@ -1348,10 +1314,6 @@ ImageCompareModel* ImageCompareModel::scale(float s)
|
|
|
|
|
ImageCompareModel::RotateMatchResult ImageCompareModel::rotateMatch(const Mat& img, int levelNum /*= 1*/, float angleStep /*= 1.0*/,
|
|
|
|
|
float startAngle /*= 0*/, float endAngle /*= 360*/) const
|
|
|
|
|
{
|
|
|
|
|
#ifdef _TEST
|
|
|
|
|
static int idx = 0;
|
|
|
|
|
std::cout << idx << " ";
|
|
|
|
|
#endif
|
|
|
|
|
RotateData* pData = new RotateData;
|
|
|
|
|
vector<Range> angleRangeVec;
|
|
|
|
|
if (levelNum > 1)
|
|
|
|
|
@ -1978,6 +1940,7 @@ void ImageCompareModel::weightReconstruction(const Mat& rImg, const Mat& baseImg
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double ImageCompareModel::penltyCoeff(double matchedVal, int diameterMean, int targetDiameter, double modelDiamter, double modelHeight) const
|
|
|
|
|
{
|
|
|
|
|
int diff = abs(diameterMean - targetDiameter);
|
|
|
|
|
@ -2173,13 +2136,7 @@ float ImageCompareModel::allocateInnerRadius(cv::Mat subImage)
|
|
|
|
|
initialPoint = p;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
Mat insideMat(tarMat.size(), tarMat.type(), Scalar::all(0));
|
|
|
|
|
int offset = 2;
|
|
|
|
|
cv::circle(insideMat, center, minDis - offset, Scalar(1), -1);
|
|
|
|
|
Mat ddst = insideMat.mul(subImage);
|
|
|
|
|
#endif
|
|
|
|
|
return minDis - 2;
|
|
|
|
|
return (minDis - 2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
float ImageCompareModel::allocateRadius(cv::Mat subImage)
|
|
|
|
|
@ -2331,13 +2288,13 @@ float ImageCompareModel::allocateRadius(cv::Mat subImage)
|
|
|
|
|
initialPoint = p;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
Mat insideMat(tarMat.size(), tarMat.type(), Scalar::all(0));
|
|
|
|
|
int offset = 2;
|
|
|
|
|
cv::circle(insideMat, center, minDis - offset, Scalar(1), -1);
|
|
|
|
|
Mat ddst = insideMat.mul(subImage);
|
|
|
|
|
#endif
|
|
|
|
|
return minDis - 2;
|
|
|
|
|
// #ifdef _DEBUG
|
|
|
|
|
// Mat insideMat(tarMat.size(), tarMat.type(), Scalar::all(0));
|
|
|
|
|
// int offset = 2;
|
|
|
|
|
// cv::circle(insideMat, center, minDis - offset, Scalar(1), -1);
|
|
|
|
|
// Mat ddst = insideMat.mul(subImage);
|
|
|
|
|
// #endif
|
|
|
|
|
return (minDis - 2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ImageCompareModel::genOutterMask()
|
|
|
|
|
@ -2368,25 +2325,25 @@ void ImageCompareModel::resizeMat(Mat src, Mat &dst)
|
|
|
|
|
cv::resize(src, dst, cv::Size(nWidth, nWidth));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ImageCompareModel::printLog(string root, string log, double n) const
|
|
|
|
|
{
|
|
|
|
|
#ifdef DEBUG_VIEW_INTERNAL_MAT
|
|
|
|
|
ofstream write;
|
|
|
|
|
write.open(root, ios::app);
|
|
|
|
|
time_t seconds = time(NULL);
|
|
|
|
|
struct tm *p;
|
|
|
|
|
p = localtime(&seconds);
|
|
|
|
|
char strTime[100] = { 0 };
|
|
|
|
|
sprintf(strTime, "%02d-%02d %02d:%02d:%02d:", 1 + p->tm_mon, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);
|
|
|
|
|
std::ostringstream str;
|
|
|
|
|
str << log;
|
|
|
|
|
if (n != 0)
|
|
|
|
|
{
|
|
|
|
|
str << n;
|
|
|
|
|
}
|
|
|
|
|
write << "time:" << string(strTime);
|
|
|
|
|
write << str.str() << "\n";
|
|
|
|
|
write.close();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
// void ImageCompareModel::printLog(string root, string log, double n) const
|
|
|
|
|
// {
|
|
|
|
|
// #ifdef DEBUG_VIEW_INTERNAL_MAT
|
|
|
|
|
// ofstream write;
|
|
|
|
|
// write.open(root, ios::app);
|
|
|
|
|
// time_t seconds = time(NULL);
|
|
|
|
|
// struct tm *p;
|
|
|
|
|
// p = localtime(&seconds);
|
|
|
|
|
// char strTime[100] = { 0 };
|
|
|
|
|
// sprintf(strTime, "%02d-%02d %02d:%02d:%02d:", 1 + p->tm_mon, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);
|
|
|
|
|
// std::ostringstream str;
|
|
|
|
|
// str << log;
|
|
|
|
|
// if (n != 0)
|
|
|
|
|
// {
|
|
|
|
|
// str << n;
|
|
|
|
|
// }
|
|
|
|
|
// write << "time:" << string(strTime);
|
|
|
|
|
// write << str.str() << "\n";
|
|
|
|
|
// write.close();
|
|
|
|
|
// #endif
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|