diff --git a/AlgorithmModule/include/CheckUtil.hpp b/AlgorithmModule/include/CheckUtil.hpp index 946fc47..c781c31 100644 --- a/AlgorithmModule/include/CheckUtil.hpp +++ b/AlgorithmModule/include/CheckUtil.hpp @@ -44,6 +44,7 @@ public: static int SizeRect(cv::Rect &roi, int img_w, int img_h, int addw, int addh); static int CalHj(const cv::Mat &img, const cv::Mat &mask, int b_value); static int CalHj(const cv::Mat &img, const cv::Mat &mask, const cv::Mat &backgroundimg); + static int CalHjWeighted(const cv::Mat &img, const cv::Mat &mask, int b_value, float power = 2.0f); static float CalRoi2RoiPre(cv::Rect rect1, cv::Rect rect2); // 计算平均灰度 static float CalImgBrightness(cv::Mat imgRoi); diff --git a/AlgorithmModule/src/CheckUtil.cpp b/AlgorithmModule/src/CheckUtil.cpp index 7b247f8..d4848a1 100644 --- a/AlgorithmModule/src/CheckUtil.cpp +++ b/AlgorithmModule/src/CheckUtil.cpp @@ -457,6 +457,32 @@ int CheckUtil::CalHj(const cv::Mat &img, const cv::Mat &mask, const cv::Mat &bac return meanValue123[0]; } +int CheckUtil::CalHjWeighted(const cv::Mat &img, const cv::Mat &mask, int b_value, float power) +{ + cv::Mat imgf; + if (img.type() != CV_32F) + img.convertTo(imgf, CV_32F); + else + imgf = img; + + cv::Mat absDiff = cv::abs(imgf - b_value); + + cv::Mat weight; + cv::pow(absDiff, power, weight); + + cv::Mat maskedDiff, maskedWeight; + absDiff.copyTo(maskedDiff, mask); + weight.copyTo(maskedWeight, mask); + + cv::Scalar weightedSum = cv::sum(maskedDiff.mul(weight)); + cv::Scalar weightSum = cv::sum(maskedWeight); + + if (weightSum[0] < 1e-6) + return 0; + + return static_cast(weightedSum[0] / weightSum[0]); +} + float CheckUtil::CalRoi2RoiPre(cv::Rect rect1, cv::Rect rect2) { // 计算交集区域 diff --git a/AlgorithmModule/src/ImgCheckAnalysisy.cpp b/AlgorithmModule/src/ImgCheckAnalysisy.cpp index c594317..3033aac 100644 --- a/AlgorithmModule/src/ImgCheckAnalysisy.cpp +++ b/AlgorithmModule/src/ImgCheckAnalysisy.cpp @@ -332,7 +332,7 @@ cv::Scalar ImgCheckAnalysisy::calc_blob_info_withstats(cv::Mat &img, const cv::M // 计算 hj(差异图像大于0的像素均值) // double hj = std::abs(fbk - fdet); - double hj = CheckUtil::CalHj(cimg, cmask, mean_bk.val[0]); + double hj = CheckUtil::CalHjWeighted(cimg, cmask, fbk, 2.0f); int worb = 0; if (fdet >= fbk) @@ -381,7 +381,7 @@ double ImgCheckAnalysisy::CalBlobHJ(cv::Mat &img, const cv::Mat &mask, cv::Rect // 计算 hj(差异图像大于0的像素均值) // double hj = std::abs(fbk - fdet); - double hj = CheckUtil::CalHj(cimg, cmask, fbk); + double hj = CheckUtil::CalHjWeighted(cimg, cmask, fbk, 2.0f); static int kkk = 0; unsigned char *pErrordata = (unsigned char *)cimg.data;