浏览代码

去文件化图像操作。

Jeff Wang 2 年之前
父节点
当前提交
c85574136c

+ 8 - 2
GameAssist/GameAssist/Assist.vcxproj.filters

@@ -70,7 +70,10 @@
       <Filter>IMGProc</Filter>
     </ClCompile>
     <ClCompile Include="KMAssist.cpp">
-      <Filter>源文件</Filter>
+      <Filter>Assist</Filter>
+    </ClCompile>
+    <ClCompile Include="ImgAssist.cpp">
+      <Filter>Assist</Filter>
     </ClCompile>
   </ItemGroup>
   <ItemGroup>
@@ -153,7 +156,10 @@
       <Filter>IMGProc</Filter>
     </ClInclude>
     <ClInclude Include="KMAssist.h">
-      <Filter>头文件</Filter>
+      <Filter>Assist</Filter>
+    </ClInclude>
+    <ClInclude Include="ImgAssist.h">
+      <Filter>Assist</Filter>
     </ClInclude>
   </ItemGroup>
   <ItemGroup>

+ 5 - 15
GameAssist/GameAssist/CAction.cpp

@@ -212,13 +212,11 @@ SRAND(80,120);
 		CRect rc2 = { 640, 45, 770, 63 };
 		for (int i = 0; i < 100; i++)
 		{
-			std::string strImg = GameGlobal::BuildImgPath(m_hGameWnd, "walk1");
-			std::string strImg2 = GameGlobal::BuildImgPath(m_hGameWnd, "walk2");
-			ImgAssist::CropPicture(m_hGameWnd, rc, strImg.c_str());
+			cv::Mat src1 = ImgAssist::CropPicture(m_hGameWnd, rc);
 			Sleep(600);
-			ImgAssist::CropPicture(m_hGameWnd, rc2, strImg2.c_str());
+			cv::Mat src2 = ImgAssist::CropPicture(m_hGameWnd, rc2);
 			// 判断2张图片是否一样;
-			if (ImgAssist::IsSimilarPicture(strImg.c_str(), strImg2.c_str()))
+			if (ImgAssist::IsSimilarPicture(src1, src2))
 			{
 				GameGlobal::DebugLog(_T("停止走路"));
 				return true;
@@ -482,11 +480,7 @@ SRAND(80,120);
 		}
 
 		// 截图;
-		TCHAR szSPImg[MAX_PATH] = { 0 };
-		_stprintf_s(szSPImg, _T("%s%p_SPValue.bmp"), GameGlobal::g_szTempDir, m_hGameWnd);
-		ImgAssist::CropPicture(m_hGameWnd, rect, szSPImg);
-
-		return ImgAssist::GetColorOccupiedLength(szSPImg, 8, 96, 248) < nSafeValue;
+		return ImgAssist::GetColorOccupiedLength(ImgAssist::CropPicture(m_hGameWnd, rect), 8, 96, 248) < nSafeValue;
 	}
 
 	bool CAction::IsHPBelowSafeValue(BOOL IsRole, BOOL IsIdle, int nSafeValue /*= 30*/)
@@ -502,11 +496,7 @@ SRAND(80,120);
 		}
 
 		// 截图;
-		TCHAR szSPImg[MAX_PATH] = { 0 };
-		_stprintf_s(szSPImg, _T("%s%p_HPValue.bmp"), GameGlobal::g_szTempDir, m_hGameWnd);
-		ImgAssist::CropPicture(m_hGameWnd, rect, szSPImg);
-
-		return ImgAssist::GetColorOccupiedLength(szSPImg, 248, 56, 64) < nSafeValue;
+		return ImgAssist::GetColorOccupiedLength(ImgAssist::CropPicture(m_hGameWnd, rect), 248, 56, 64) < nSafeValue;
 	}
 
 	void CAction::FightingJY(BOOL bHasSummoner, int nZJType, BOOL bAggressiveSkill)

+ 63 - 80
GameAssist/GameAssist/ImgAssist.cpp

@@ -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;

+ 5 - 0
GameAssist/GameAssist/ImgAssist.h

@@ -8,12 +8,17 @@ namespace ImgAssist
 	BOOL OpenImage(std::string strImag, cv::Mat& img);
 	cv::Mat OpenImage(std::string strImage);
 	BOOL SetImgThreshold(cv::Mat& srcImg, cv::Mat& thresholdImg, long nThresholdVal, long nMaxThresholdVal, int type = 0);
+	BOOL GetImgMatchtemplate(HWND hWnd, cv::Mat cvTempImg, RECT& rc, double lowestMatchValue = 0.900);
+	BOOL GetImgMatchtemplate(cv::Mat cvSrcImg, cv::Mat cvTempImg, RECT& rc, double lowestMatchValue = 0.900);
 	BOOL GetImgMatchtemplate(HWND hWnd, std::string strTempImg, RECT& rc, double lowestMatchValue = 0.900);
 	BOOL GetImgMatchtemplate(std::string strSrcImg, std::string strTempImg, RECT& rc, double lowestMatchValue = 0.900);
+	BOOL IsMatchIcon(cv::Mat cvSrcImg, cv::Mat cvTempImg, RECT srcRect, RECT& matchRect, double lowestMatchValue = 0.900);
 	BOOL IsMatchIcon(HWND hWnd, std::string strTempImg, RECT srcRect, RECT& matchRect, double lowestMatchValue = 0.900);
 	BOOL CropPicture(HWND hWnd, CRect rc, const char* szSaveName); // 剪裁图片;
 	cv::Mat CropPicture(HWND hWnd, CRect rc);
 	BOOL IsSimilarPicture(const char* szp1, const char* szp2, double lowestMatchValue = 0.99);
+	BOOL IsSimilarPicture(cv::Mat src1, cv::Mat src2, double lowestMatchValue = 0.99);
 	// 获取指定颜色占用矩形长度比例;
 	int GetColorOccupiedLength(std::string strImg, int r, int g, int b);
+	int GetColorOccupiedLength(cv::Mat src, int r, int g, int b);
 };