|
@@ -466,25 +466,33 @@ CV_API bool MatchSingleImage(cv::Mat& img, cv::Mat templImg, double& matchVal, c
|
|
|
0);
|
|
|
// 输出到文件中;
|
|
|
imwrite("showImg.png", showImg);
|
|
|
+ // 释放对象;
|
|
|
+ showImg.release();
|
|
|
#endif
|
|
|
|
|
|
+ // 释放对象;
|
|
|
+ resultImg.release();
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
CV_API bool MatchSingleImage(cv::Mat& img, std::string strTmpImg, double& matchVal, cv::Rect& matchRect)
|
|
|
{
|
|
|
- if (img.empty() || !PathFileExists(strTmpImg.c_str()))
|
|
|
+ if (img.empty())
|
|
|
return false;
|
|
|
|
|
|
// 读取模板图片;
|
|
|
- cv::Mat templ = imread(strTmpImg.c_str(), cv::IMREAD_COLOR);
|
|
|
- if (templ.empty())
|
|
|
+ cv::Mat templImg = imread(strTmpImg.c_str(), cv::IMREAD_COLOR);
|
|
|
+ if (templImg.empty()) {
|
|
|
return false;
|
|
|
+ }
|
|
|
|
|
|
cv::Mat resultImg;
|
|
|
- cv::matchTemplate(img, templ, resultImg, cv::TM_CCOEFF_NORMED);
|
|
|
- if (resultImg.empty() )
|
|
|
+ cv::matchTemplate(img, templImg, resultImg, cv::TM_CCOEFF_NORMED);
|
|
|
+ if (resultImg.empty()) {
|
|
|
+ templImg.release();
|
|
|
return false;
|
|
|
+ }
|
|
|
|
|
|
// 最小和最大匹配值;
|
|
|
double lv_nMinVal = 0.0;
|
|
@@ -499,8 +507,8 @@ CV_API bool MatchSingleImage(cv::Mat& img, std::string strTmpImg, double& matchV
|
|
|
// 匹配区域,使用最大区域;
|
|
|
matchRect.x = lv_nMaxLoc.x;
|
|
|
matchRect.y = lv_nMaxLoc.y;
|
|
|
- matchRect.width = templ.cols;
|
|
|
- matchRect.height = templ.rows;
|
|
|
+ matchRect.width = templImg.cols;
|
|
|
+ matchRect.height = templImg.rows;
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
// 在原图上框出模板位置;
|
|
@@ -508,29 +516,43 @@ CV_API bool MatchSingleImage(cv::Mat& img, std::string strTmpImg, double& matchV
|
|
|
img.copyTo(showImg);
|
|
|
cv::rectangle(showImg,
|
|
|
cv::Point(lv_nMaxLoc.x, lv_nMaxLoc.y),
|
|
|
- cv::Point(lv_nMaxLoc.x + templ.cols, lv_nMaxLoc.y + templ.rows),
|
|
|
+ cv::Point(lv_nMaxLoc.x + templImg.cols, lv_nMaxLoc.y + templImg.rows),
|
|
|
cv::Scalar(rand() % 255, rand() % 255, rand() % 255),
|
|
|
2,
|
|
|
cv::LINE_AA,
|
|
|
0);
|
|
|
// 输出到文件中;
|
|
|
imwrite("showImg.png", showImg);
|
|
|
+ // 释放对象;
|
|
|
+ showImg.release();
|
|
|
#endif
|
|
|
|
|
|
+ // 释放对象;
|
|
|
+ templImg.release();
|
|
|
+ resultImg.release();
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
CV_API bool MatchSingleImage(std::string strImg, std::string strTmpImg, double& matchVal, cv::Rect& matchRect)
|
|
|
{
|
|
|
cv::Mat img;
|
|
|
- cv::Mat templ;
|
|
|
- if (!ReadImage(strImg.c_str(), img) || !ReadImage(strTmpImg.c_str(), templ))
|
|
|
+ cv::Mat templImg;
|
|
|
+ if (!ReadImage(strImg.c_str(), img) )
|
|
|
return false;
|
|
|
|
|
|
+ if (!ReadImage(strTmpImg.c_str(), templImg)) {
|
|
|
+ img.release();
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
cv::Mat resultImg;
|
|
|
- cv::matchTemplate(img, templ, resultImg, cv::TM_CCOEFF_NORMED);
|
|
|
- if (resultImg.empty())
|
|
|
+ cv::matchTemplate(img, templImg, resultImg, cv::TM_CCOEFF_NORMED);
|
|
|
+ if (resultImg.empty()) {
|
|
|
+ img.release();
|
|
|
+ templImg.release();
|
|
|
return false;
|
|
|
+ }
|
|
|
|
|
|
// 最小和最大匹配值;
|
|
|
double lv_nMinVal = 0.0;
|
|
@@ -545,8 +567,8 @@ CV_API bool MatchSingleImage(std::string strImg, std::string strTmpImg, double&
|
|
|
// 匹配区域,使用最大区域;
|
|
|
matchRect.x = lv_nMaxLoc.x;
|
|
|
matchRect.y = lv_nMaxLoc.y;
|
|
|
- matchRect.width = templ.cols;
|
|
|
- matchRect.height = templ.rows;
|
|
|
+ matchRect.width = templImg.cols;
|
|
|
+ matchRect.height = templImg.rows;
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
// 在原图上框出模板位置;
|
|
@@ -554,15 +576,22 @@ CV_API bool MatchSingleImage(std::string strImg, std::string strTmpImg, double&
|
|
|
img.copyTo(showImg);
|
|
|
cv::rectangle(showImg,
|
|
|
cv::Point(lv_nMaxLoc.x, lv_nMaxLoc.y),
|
|
|
- cv::Point(lv_nMaxLoc.x + templ.cols, lv_nMaxLoc.y + templ.rows),
|
|
|
+ cv::Point(lv_nMaxLoc.x + templImg.cols, lv_nMaxLoc.y + templImg.rows),
|
|
|
cv::Scalar(rand() % 255, rand() % 255, rand() % 255),
|
|
|
2,
|
|
|
cv::LINE_AA,
|
|
|
0);
|
|
|
// 输出到文件中;
|
|
|
imwrite("showImg.png", showImg);
|
|
|
+ // 释放对象;
|
|
|
+ showImg.release();
|
|
|
#endif
|
|
|
|
|
|
+ // 释放对象;
|
|
|
+ img.release();
|
|
|
+ templImg.release();
|
|
|
+ resultImg.release();
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -571,7 +600,31 @@ CV_API bool Mat2Bitmap(cv::Mat& img, CBitmap& bitmap)
|
|
|
return CV_API bool();
|
|
|
}
|
|
|
|
|
|
+CV_API bool Mat2HBitmap(cv::Mat& img, HBITMAP& bitmap)
|
|
|
+{
|
|
|
+ //MAT类的TYPE=(nChannels-1+ CV_8U)<<3
|
|
|
+ int nChannels = (img.type() >> 3) - CV_8U + 1;
|
|
|
+ int iSize = img.cols * img.rows * nChannels;
|
|
|
+ bitmap = CreateBitmap(img.cols, img.rows, 1, nChannels * 8, img.data);
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
CV_API bool Mat2GdiplusBitmap(cv::Mat& img, Gdiplus::Bitmap& bitmap)
|
|
|
{
|
|
|
return CV_API bool();
|
|
|
}
|
|
|
+
|
|
|
+CV_API bool Bitmap2Mat(CBitmap& bitmap, cv::Mat& img)
|
|
|
+{
|
|
|
+ return CV_API bool();
|
|
|
+}
|
|
|
+
|
|
|
+CV_API bool HBitmap2Mat(HBITMAP& bitmap, cv::Mat& img)
|
|
|
+{
|
|
|
+ return CV_API bool();
|
|
|
+}
|
|
|
+
|
|
|
+CV_API bool GdiplusBitmap2Mat(Gdiplus::Bitmap& bitmap, cv::Mat& img)
|
|
|
+{
|
|
|
+ return CV_API bool();
|
|
|
+}
|