|
@@ -300,17 +300,23 @@ namespace ImgAssist
|
|
|
return TRUE;
|
|
|
}
|
|
|
|
|
|
- BOOL GetImgMatchtemplate(HWND hWnd, std::string strTempImg, RECT& rc, double lowestMatchValue)
|
|
|
+ BOOL GetImgMatchtemplate(HWND hWnd, cv::Mat cvTempImg, RECT& rc, double lowestMatchValue)
|
|
|
{
|
|
|
- cv::Mat srcImg = CaptureWnd(hWnd), tempImg, matchImg;
|
|
|
- if (srcImg.empty() || !OpenImage(strTempImg, tempImg))
|
|
|
+ cv::Mat srcImg = CaptureWnd(hWnd);
|
|
|
+ return GetImgMatchtemplate(srcImg, cvTempImg, rc, lowestMatchValue);
|
|
|
+ }
|
|
|
+
|
|
|
+ BOOL GetImgMatchtemplate(cv::Mat cvSrcImg, cv::Mat cvTempImg, RECT& rc, double lowestMatchValue)
|
|
|
+ {
|
|
|
+ if (cvSrcImg.empty() || cvTempImg.empty())
|
|
|
{
|
|
|
- if (srcImg.data) srcImg.release();
|
|
|
- if (tempImg.data) tempImg.release();
|
|
|
+ if (cvSrcImg.data) cvSrcImg.release();
|
|
|
+ if (cvTempImg.data) cvTempImg.release();
|
|
|
return FALSE;
|
|
|
}
|
|
|
|
|
|
- cv::matchTemplate(srcImg, tempImg, matchImg, cv::TM_CCOEFF_NORMED);
|
|
|
+ cv::Mat matchImg;
|
|
|
+ cv::matchTemplate(cvSrcImg, cvTempImg, matchImg, cv::TM_CCOEFF_NORMED);
|
|
|
// 归一化到0~1
|
|
|
//cv::normalize(matchImg, matchImg, 0, 1, cv::NORM_MINMAX, -1);
|
|
|
|
|
@@ -321,17 +327,18 @@ namespace ImgAssist
|
|
|
cv::Point lv_MatchLoc = cv::Point(0, 0);
|
|
|
cv::minMaxLoc(matchImg, &lv_nMinVal, &lv_nMaxVal, &lv_nMinLoc, &lv_nMaxLoc);
|
|
|
|
|
|
- cv::Rect roi = cv::Rect(lv_nMaxLoc.x, lv_nMaxLoc.y, tempImg.cols, tempImg.rows);
|
|
|
- cv::Mat roiImg = srcImg(roi);
|
|
|
+ cv::Rect roi = cv::Rect(lv_nMaxLoc.x, lv_nMaxLoc.y, cvTempImg.cols, cvTempImg.rows);
|
|
|
+ cv::Mat roiImg = cvSrcImg(roi);
|
|
|
+#ifdef DEBUG
|
|
|
cv::imwrite(GameGlobal::BuildImgPath(hWnd, _T("match")), roiImg);
|
|
|
-
|
|
|
+#endif
|
|
|
rc.left = lv_nMaxLoc.x - GameGlobal::frameWidth;
|
|
|
rc.top = lv_nMaxLoc.y - GameGlobal::titleBarHeight;
|
|
|
- rc.right = rc.left + tempImg.cols;
|
|
|
- rc.bottom = rc.top + tempImg.rows;
|
|
|
+ rc.right = rc.left + cvTempImg.cols;
|
|
|
+ rc.bottom = rc.top + cvTempImg.rows;
|
|
|
|
|
|
- srcImg.release();
|
|
|
- tempImg.release();
|
|
|
+ cvSrcImg.release();
|
|
|
+ cvTempImg.release();
|
|
|
matchImg.release();
|
|
|
roiImg.release();
|
|
|
|
|
@@ -339,59 +346,30 @@ namespace ImgAssist
|
|
|
return (lv_nMaxVal >= lowestMatchValue ? TRUE : FALSE);
|
|
|
}
|
|
|
|
|
|
- BOOL GetImgMatchtemplate(std::string strSrcImg, std::string strTempImg, RECT& rc, double lowestMatchValue)
|
|
|
+ BOOL GetImgMatchtemplate(HWND hWnd, std::string strTempImg, RECT& rc, double lowestMatchValue)
|
|
|
{
|
|
|
- cv::Mat srcImg, tempImg, matchImg;
|
|
|
- if (!OpenImage(strSrcImg, srcImg) || !OpenImage(strTempImg, tempImg))
|
|
|
- {
|
|
|
- if (srcImg.data) srcImg.release();
|
|
|
- if (tempImg.data) tempImg.release();
|
|
|
- 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);
|
|
|
-
|
|
|
- cv::Rect roi = cv::Rect(lv_nMaxLoc.x, lv_nMaxLoc.y, tempImg.cols, tempImg.rows);
|
|
|
- cv::Mat roiImg = srcImg(roi);
|
|
|
- //cv::imwrite("G:\\bin\\GameAssist\\match.bmp", roiImg);
|
|
|
-
|
|
|
- rc.left = lv_nMaxLoc.x - GameGlobal::frameWidth;
|
|
|
- rc.top = lv_nMaxLoc.y - GameGlobal::titleBarHeight;
|
|
|
- rc.right = rc.left + tempImg.cols;
|
|
|
- rc.bottom = rc.top + tempImg.rows;
|
|
|
-
|
|
|
- srcImg.release();
|
|
|
- tempImg.release();
|
|
|
- matchImg.release();
|
|
|
- roiImg.release();
|
|
|
+ cv::Mat tempImg = OpenImage(strTempImg);
|
|
|
+ return GetImgMatchtemplate(hWnd, tempImg, rc, lowestMatchValue);
|
|
|
+ }
|
|
|
|
|
|
- // 是否大于最低匹配度;
|
|
|
- return (lv_nMaxVal >= lowestMatchValue ? TRUE : FALSE);
|
|
|
+ BOOL GetImgMatchtemplate(std::string strSrcImg, std::string strTempImg, RECT& rc, double lowestMatchValue)
|
|
|
+ {
|
|
|
+ cv::Mat srcImg = OpenImage(strSrcImg), tempImg = OpenImage(strTempImg);
|
|
|
+ return GetImgMatchtemplate(srcImg, tempImg, rc, lowestMatchValue);
|
|
|
}
|
|
|
|
|
|
- BOOL IsMatchIcon(HWND hWnd, std::string strTempImg, RECT srcRect, RECT& matchRect, double lowestMatchValue)
|
|
|
+ BOOL IsMatchIcon(cv::Mat cvSrcImg, cv::Mat cvTempImg, RECT srcRect, RECT& matchRect, double lowestMatchValue)
|
|
|
{
|
|
|
- cv::Mat srcImg = CaptureWnd(hWnd), tempImg, matchImg;
|
|
|
- if (srcImg.empty() || !OpenImage(strTempImg, tempImg))
|
|
|
+ if (cvSrcImg.empty() || cvTempImg.empty())
|
|
|
{
|
|
|
- if (srcImg.data) srcImg.release();
|
|
|
- if (tempImg.data) tempImg.release();
|
|
|
+ if (cvSrcImg.data) cvSrcImg.release();
|
|
|
+ if (cvTempImg.data) cvTempImg.release();
|
|
|
return FALSE;
|
|
|
}
|
|
|
|
|
|
// 指定源图片区域来做模块比较,提高效率;
|
|
|
- cv::Mat imgROI;
|
|
|
- imgROI = srcImg(cv::Rect(srcRect.left, srcRect.top, srcRect.right - srcRect.left, srcRect.bottom - srcRect.top));
|
|
|
- cv::imwrite(GameGlobal::BuildImgPath(hWnd, _T("roi")), imgROI);
|
|
|
+ cv::Mat imgROI = cvSrcImg(cv::Rect(srcRect.left, srcRect.top, srcRect.right - srcRect.left, srcRect.bottom - srcRect.top));
|
|
|
+ //cv::imwrite(GameGlobal::BuildImgPath(hWnd, _T("roi")), imgROI);
|
|
|
/*
|
|
|
m_ImgROI = srcImg([&]()-> cv::Rect {
|
|
|
// 注意是x,y,w=cols,h=rows
|
|
@@ -399,7 +377,8 @@ namespace ImgAssist
|
|
|
}());
|
|
|
*/
|
|
|
|
|
|
- cv::matchTemplate(imgROI, tempImg, matchImg, cv::TM_CCOEFF_NORMED);
|
|
|
+ cv::Mat matchImg;
|
|
|
+ cv::matchTemplate(imgROI, cvTempImg, matchImg, cv::TM_CCOEFF_NORMED);
|
|
|
// 归一化到0~1
|
|
|
//cv::normalize(matchImg, matchImg, 0, 1, cv::NORM_MINMAX, -1);
|
|
|
|
|
@@ -410,18 +389,19 @@ namespace ImgAssist
|
|
|
cv::Point lv_MatchLoc = cv::Point(0, 0);
|
|
|
cv::minMaxLoc(matchImg, &lv_nMinVal, &lv_nMaxVal, &lv_nMinLoc, &lv_nMaxLoc);
|
|
|
|
|
|
- cv::Rect roi = cv::Rect(lv_nMaxLoc.x, lv_nMaxLoc.y, tempImg.cols, tempImg.rows);
|
|
|
+ cv::Rect roi = cv::Rect(lv_nMaxLoc.x, lv_nMaxLoc.y, cvTempImg.cols, cvTempImg.rows);
|
|
|
cv::Mat roiImg = imgROI(roi);
|
|
|
+#ifdef DEBUG
|
|
|
cv::imwrite(GameGlobal::BuildImgPath(hWnd, _T("match")), roiImg);
|
|
|
-
|
|
|
+#endif
|
|
|
matchRect.left = srcRect.left + lv_nMaxLoc.x - GameGlobal::frameWidth;
|
|
|
matchRect.top = srcRect.top + lv_nMaxLoc.y - GameGlobal::titleBarHeight;
|
|
|
- matchRect.right = matchRect.left + tempImg.cols;
|
|
|
- matchRect.bottom = matchRect.top + tempImg.rows;
|
|
|
+ matchRect.right = matchRect.left + cvTempImg.cols;
|
|
|
+ matchRect.bottom = matchRect.top + cvTempImg.rows;
|
|
|
|
|
|
imgROI.release();
|
|
|
- srcImg.release();
|
|
|
- tempImg.release();
|
|
|
+ cvSrcImg.release();
|
|
|
+ cvTempImg.release();
|
|
|
matchImg.release();
|
|
|
roiImg.release();
|
|
|
|
|
@@ -429,18 +409,15 @@ namespace ImgAssist
|
|
|
return (lv_nMaxVal >= lowestMatchValue ? TRUE : FALSE);
|
|
|
}
|
|
|
|
|
|
- BOOL CropPicture(HWND hWnd, CRect rc, const char* szSaveName)
|
|
|
+ BOOL IsMatchIcon(HWND hWnd, std::string strTempImg, RECT srcRect, RECT& matchRect, double lowestMatchValue)
|
|
|
{
|
|
|
- cv::Mat srcImg = CaptureWnd(hWnd), tempImg, matchImg;
|
|
|
- if (srcImg.empty())
|
|
|
- {
|
|
|
- if (srcImg.data) srcImg.release();
|
|
|
- return FALSE;
|
|
|
- }
|
|
|
+ cv::Mat srcImg = CaptureWnd(hWnd), tempImg = OpenImage(strTempImg);
|
|
|
+ return IsMatchIcon(srcImg, tempImg, srcRect, matchRect, lowestMatchValue);
|
|
|
+ }
|
|
|
|
|
|
- // 指定源图片区域来做模块比较,提高效率;
|
|
|
- cv::Mat imgROI;
|
|
|
- imgROI = srcImg(cv::Rect(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top));
|
|
|
+ BOOL CropPicture(HWND hWnd, CRect rc, const char* szSaveName)
|
|
|
+ {
|
|
|
+ cv::Mat imgROI = CropPicture(hWnd, rc);
|
|
|
return cv::imwrite(szSaveName, imgROI);
|
|
|
}
|
|
|
|
|
@@ -460,11 +437,13 @@ namespace ImgAssist
|
|
|
|
|
|
BOOL IsSimilarPicture(const char* szp1, const char* szp2, double lowestMatchValue)
|
|
|
{
|
|
|
- cv::Mat src, dest, matchImg;
|
|
|
- src = cv::imread(szp1);
|
|
|
- dest = cv::imread(szp2);
|
|
|
+ return IsSimilarPicture(cv::imread(szp1), cv::imread(szp2), lowestMatchValue);
|
|
|
+ }
|
|
|
|
|
|
- cv::matchTemplate(src, dest, matchImg, cv::TM_CCOEFF_NORMED);
|
|
|
+ BOOL IsSimilarPicture(cv::Mat src1, cv::Mat src2, double lowestMatchValue)
|
|
|
+ {
|
|
|
+ cv::Mat matchImg;
|
|
|
+ cv::matchTemplate(src1, src2, matchImg, cv::TM_CCOEFF_NORMED);
|
|
|
// 归一化到0~1
|
|
|
//cv::normalize(matchImg, matchImg, 0, 1, cv::NORM_MINMAX, -1);
|
|
|
|
|
@@ -475,9 +454,9 @@ namespace ImgAssist
|
|
|
cv::Point lv_MatchLoc = cv::Point(0, 0);
|
|
|
cv::minMaxLoc(matchImg, &lv_nMinVal, &lv_nMaxVal, &lv_nMinLoc, &lv_nMaxLoc);
|
|
|
|
|
|
- src.release();
|
|
|
+ src1.release();
|
|
|
matchImg.release();
|
|
|
- dest.release();
|
|
|
+ src2.release();
|
|
|
|
|
|
// 是否大于最低匹配度;
|
|
|
return (lv_nMaxVal >= lowestMatchValue ? TRUE : FALSE);
|
|
@@ -485,7 +464,11 @@ namespace ImgAssist
|
|
|
|
|
|
int GetColorOccupiedLength(std::string strImg, int r, int g, int b)
|
|
|
{
|
|
|
- cv::Mat src = cv::imread(strImg.c_str());
|
|
|
+ return GetColorOccupiedLength(cv::imread(strImg.c_str()), r, g,b);
|
|
|
+ }
|
|
|
+
|
|
|
+ int GetColorOccupiedLength(cv::Mat src, int r, int g, int b)
|
|
|
+ {
|
|
|
// 获取图片的矩形大小;
|
|
|
int width = src.cols;
|
|
|
int height = src.rows;
|