|
@@ -666,4 +666,92 @@ namespace GAssist
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ BOOL OpenImage(std::string strImag, cv::Mat img)
|
|
|
|
+ {
|
|
|
|
+ if (!PathFileExists(strImag.c_str()))
|
|
|
|
+ return FALSE;
|
|
|
|
+
|
|
|
|
+ if (img.data != NULL)
|
|
|
|
+ img.release();
|
|
|
|
+
|
|
|
|
+ img = cv::imread(strImag.c_str(), cv::IMREAD_COLOR);
|
|
|
|
+ if (img.data == NULL)
|
|
|
|
+ return FALSE;
|
|
|
|
+
|
|
|
|
+ return TRUE;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ BOOL SetImgThreshold(cv::Mat srcImg, cv::Mat thresholdImg, long nThresholdVal, long nMaxThresholdVal, int type)
|
|
|
|
+ {
|
|
|
|
+ if (srcImg.data == NULL)
|
|
|
|
+ return FALSE;
|
|
|
|
+
|
|
|
|
+ if (thresholdImg.data)
|
|
|
|
+ thresholdImg.release();
|
|
|
|
+
|
|
|
|
+ switch (type)
|
|
|
|
+ {
|
|
|
|
+ case 0://全局阀值;
|
|
|
|
+ {
|
|
|
|
+ // 转成灰阶图;
|
|
|
|
+ cv::cvtColor(srcImg, thresholdImg, cv::COLOR_BGR2GRAY);
|
|
|
|
+ // 再高斯模糊处理(滤波);
|
|
|
|
+ cv::GaussianBlur(thresholdImg, thresholdImg, cv::Size(5, 5), 0, 0);
|
|
|
|
+ // 二值化;//全局化指定的阀值与返回值相等;
|
|
|
|
+ double dRetVal = cv::threshold(thresholdImg, thresholdImg, nThresholdVal, nMaxThresholdVal, cv::THRESH_BINARY);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case 1://自适应阀值;
|
|
|
|
+ {
|
|
|
|
+ // 转成灰阶图;
|
|
|
|
+ cv::cvtColor(srcImg, thresholdImg, cv::COLOR_BGR2GRAY);
|
|
|
|
+ // 再高斯模糊处理(滤波);
|
|
|
|
+ cv::GaussianBlur(thresholdImg, thresholdImg, cv::Size(3, 3), 0, 0);
|
|
|
|
+ // 自适应阀值;
|
|
|
|
+ cv::medianBlur(thresholdImg, thresholdImg, 3);
|
|
|
|
+ // 局部二值化;//blocksize一般取3、5、7
|
|
|
|
+ cv::adaptiveThreshold(thresholdImg, thresholdImg, 255, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, 3, 4.5);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case 2:// otsu阀值;
|
|
|
|
+ {
|
|
|
|
+ cv::cvtColor(srcImg, thresholdImg, cv::COLOR_BGR2GRAY);
|
|
|
|
+ // 高斯模糊;
|
|
|
|
+ cv::GaussianBlur(thresholdImg, thresholdImg, cv::Size(3, 3), 0, 0);
|
|
|
|
+ cv::threshold(thresholdImg, thresholdImg, nThresholdVal, nMaxThresholdVal, cv::THRESH_BINARY | cv::THRESH_OTSU);
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ BOOL GetImgMatchtemplate(std::string strSrcImg, std::string strTempImg, RECT& rc, double lowestMatchValue)
|
|
|
|
+ {
|
|
|
|
+ cv::Mat srcImg, tempImg, matchImg;
|
|
|
|
+ if (!OpenImage(strSrcImg, srcImg) || !OpenImage(strTempImg, tempImg))
|
|
|
|
+ return FALSE;
|
|
|
|
+
|
|
|
|
+ cv::matchTemplate(srcImg, tempImg, matchImg, cv::TM_CCOEFF_NORMED);
|
|
|
|
+ // 归一化到0~1
|
|
|
|
+ //cv::normalize(matchImg, matchImg, 0, 1, cv::NORM_MINMAX, -1);
|
|
|
|
+
|
|
|
|
+ double lv_nMinVal = 0.0;
|
|
|
|
+ double lv_nMaxVal = 0.0;
|
|
|
|
+ cv::Point lv_nMinLoc = cv::Point(0, 0);
|
|
|
|
+ cv::Point lv_nMaxLoc = cv::Point(0, 0);
|
|
|
|
+ cv::Point lv_MatchLoc = cv::Point(0, 0);
|
|
|
|
+ cv::minMaxLoc(matchImg, &lv_nMinVal, &lv_nMaxVal, &lv_nMinLoc, &lv_nMaxLoc);
|
|
|
|
+
|
|
|
|
+ rc.left = lv_nMaxLoc.x;
|
|
|
|
+ rc.top = lv_nMaxLoc.y;
|
|
|
|
+ rc.right = rc.left + matchImg.cols;
|
|
|
|
+ rc.bottom = rc.top + matchImg.rows;
|
|
|
|
+
|
|
|
|
+ // 是否大于最低匹配度;
|
|
|
|
+ return (lv_nMaxVal >= lowestMatchValue ? TRUE : FALSE);
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|