【发布时间】:2015-08-16 23:49:29
【问题描述】:
我正在尝试匹配这张图片
在这张图片中
但是,我找不到一个以上的 Boss 敌人。我需要做什么才能找到其他人?
图片加载
struct XYposition{
float X;
float Y;
};
std::vector<cv::Mat> bossList;
std::string bossStrings[1] = { "sprites\\boss\\bossUp.png" };
for (int i = 0; i < 1; i++){
cv::Mat pic = cv::imread(bossStrings[i], CV_LOAD_IMAGE_GRAYSCALE);
bossList.push_back(pic);
}
multipleTemplateMatch(screenImage, bossList);
模板匹配
std::vector<XYposition> multipleTemplateMatch(cv::Mat &img, std::vector<cv::Mat> tplList){
std::vector<XYposition> matches;
cv::Mat convertImg(img.rows, img.cols, CV_8UC3);
cv::cvtColor(img, convertImg, CV_BGRA2GRAY);
double threshold = 0.8;
int imgint = convertImg.type();
for(cv::Mat tpl : tplList){
int tplint = tpl.type();
cv::Mat result(convertImg.rows - tpl.rows + 1, convertImg.cols - tpl.cols + 1,
CV_32FC1); //must be this result type
cv::matchTemplate(convertImg, tpl, result, CV_TM_CCOEFF_NORMED);
cv::threshold(result, result, threshold, 1., CV_THRESH_TOZERO);
while (true)
{
double minval, maxval;
cv::Point minloc, maxloc;
cv::minMaxLoc(result, &minval, &maxval, &minloc, &maxloc);
if (maxval >= threshold)
{
rectangle(result, maxloc, cv::Point(maxloc.x - tpl.cols, maxloc.y - tpl.rows),
cv::Scalar(0, 0, 255), 4, 8, 0);
cv::floodFill(result, maxloc, cv::Scalar(0), 0, cv::Scalar(.1), cv::Scalar(1.));
XYposition info = {
maxloc.x - ceil(tpl.cols / 2), maxloc.y - ceil(tpl.rows / 2)
};
matches.push_back(info);
}
else
break;
}
}
return matches;
}
【问题讨论】:
-
有趣....事后看来它应该可以工作。如果我正确地解释了您的代码,那么每次您找到一个成功的匹配项时,您都会将与该匹配项相关的矩形空白,这样您就不会再次检测到同一个矩形(通过
cv::floodFill)。您能否更具体地说明“找不到一个以上的boss敌人”是什么意思?你的意思是你只能找到一个敌人?每种类型一个敌人? -
@rayryeng 我只找到了四个绿色 Boss 敌人之一,特别是最左边的那个。我希望找到所有四个。
-
您可能会发现这个答案很有用! answers.opencv.org/question/54254/…
标签: c++ opencv image-processing template-matching