Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多模板匹配只检测一个匹配_C++_Opencv_Image Processing_Template Matching - Fatal编程技术网

C++ 多模板匹配只检测一个匹配

C++ 多模板匹配只检测一个匹配,c++,opencv,image-processing,template-matching,C++,Opencv,Image Processing,Template Matching,我正在尝试匹配此图像 在这幅图中 然而,我找不到一个以上的老板敌人。我需要做什么才能找到其他人 图像加载 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 = c

我正在尝试匹配此图像

在这幅图中

然而,我找不到一个以上的老板敌人。我需要做什么才能找到其他人

图像加载

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;
}
struct XYposition{
浮动X;
浮动Y;
};
std::向量bossList;
std::string bossStrings[1]={“sprites\\boss\\bossUp.png”};
对于(int i=0;i<1;i++){
cv::Mat pic=cv::imread(BossString[i],cv\U LOAD\U IMAGE\U灰度);
bossList.向后推(图);
}
multipleTemplateMatch(屏幕图像、bossList);
模板匹配

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;
}
std::vector multipleTemplateMatch(cv::Mat&img,std::vector tplList){
向量匹配;
cv::Mat convertImg(img.rows、img.cols、cv_8UC3);
cv::CVT颜色(img、convertImg、cv_BGRA2GRAY);
双阈值=0.8;
int imgint=convertImg.type();
对于(cv::Mat tpl:tplList){
int tplint=tpl.type();
cv::Mat结果(convertImg.rows-tpl.rows+1,convertImg.cols-tpl.cols+1,
CV_32FC1);//必须是此结果类型
cv::matchTemplate(转换、第三方物流、结果、cv_TM_Cceff_NORMED);
cv::threshold(结果,结果,阈值,1.,cv_THRESH_至零);
while(true)
{
双最小值,最大值;
cv::minloc点、maxloc点;
cv::minMaxLoc(结果,&minval,&maxval,&minloc,&maxloc);
如果(最大值>=阈值)
{
矩形(结果,maxloc,cv::Point(maxloc.x-tpl.cols,maxloc.y-tpl.rows),
cv::标量(0,025),4,8,0);
cv::floodFill(结果,maxloc,cv::Scalar(0),0,cv::Scalar(.1),cv::Scalar(1.);
XYposition信息={
maxloc.x-ceil(tpl.cols/2),maxloc.y-ceil(tpl.rows/2)
};
匹配。推回(信息);
}
其他的
打破
}
}
返回比赛;
}

我没有调试您的代码,但由于它不起作用(可能是
泛洪填充
弄乱了您的结果矩阵),这是一个简单的工作示例

我遍历结果矩阵中的最大点,找到值超过阈值的blob,并在每个blob中找到最高值(用作检索结果矩阵中实际值的掩码)

#包括
#包括
使用名称空间std;
使用名称空间cv;
int main()
{
Mat3b img=imread(“路径到图像”);
Mat3b templ=imread(“路径到模板”);
Mat1b img_gray;
Mat1b templ_gray;
CVT颜色(img、img_灰色、颜色_BGR2灰色);
CVT颜色(模板、模板灰、颜色灰);
Mat1f结果;
匹配模板(img、temp、result、TM\u cceff\u NORMED);
双阈值=0.7;
阈值(结果,结果,阈值,1.,阈值二进制);
Mat1b resb;
结果转换为(resb,CV_8U,255);
矢量等值线;
findContours(轮廓线、轮廓线、修复列表、链近似图和简单图);

对于(int i=0;i interesting….事后看来应该可以。如果我正确解释了您的代码,每次您找到成功匹配,您都会将与此匹配相关的矩形清空,这样您就不会再次检测到相同的矩形(通过
cv::floodFill
)。您能更具体地解释一下您的意思吗“最多只能找到一个老板敌人”?你是说你只能找到一个敌人?每种类型一个敌人?@rayryeng我只能找到四个绿色老板敌人中的一个,特别是最左边的那个。我希望能找到所有四个。你可能会发现这个答案很有用!