多个模板匹配仅检测到一个匹配项

2023-12-04

我正在尝试匹配这张图片

enter image description here

在这张图片中

enter image description here

然而,我找不到超过一个的头目敌人。我需要做什么才能找到其他人?

图片加载

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

我没有调试你的代码,但因为它不起作用(可能floodfill弄乱了你的结果矩阵),这是一个简单的工作示例。

我迭代结果矩阵中的最大点,查找值超过阈值的斑点,并查找每个斑点内的最高值(用作检索结果矩阵中实际值的掩码)。

#include <opencv2\opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;

int main()
{
    Mat3b img = imread("path_to_image");
    Mat3b templ = imread("path_to_template");

    Mat1b img_gray;
    Mat1b templ_gray;
    cvtColor(img, img_gray, COLOR_BGR2GRAY);
    cvtColor(templ, templ_gray, COLOR_BGR2GRAY);

    Mat1f result;
    matchTemplate(img, templ, result, TM_CCOEFF_NORMED);

    double thresh = 0.7;
    threshold(result, result, thresh, 1., THRESH_BINARY);

    Mat1b resb;
    result.convertTo(resb, CV_8U, 255);

    vector<vector<Point>> contours;
    findContours(resb, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);

    for (int i=0; i<contours.size(); ++i)
    {
        Mat1b mask(result.rows, result.cols, uchar(0));
        drawContours(mask, contours, i, Scalar(255), CV_FILLED);

        Point max_point;
        double max_val;
        minMaxLoc(result, NULL, &max_val, NULL, &max_point, mask);

        rectangle(img, Rect(max_point.x, max_point.y, templ.cols, templ.rows), Scalar(0,255,0), 2);
    }
    return 0;
}

Result:

enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多个模板匹配仅检测到一个匹配项 的相关文章

随机推荐

  • 使用 Python 进程进行多处理

    我正在尝试使用 Process 将Python脚本修改为多进程 问题是它不起作用 第一步 按顺序检索内容 test1 test2 在第二个中 将并行调用它 test1 和 test2 实际上没有速度差异 如果单独执行这些函数 您会注意到差异
  • Android ActionBar setActionView布局问题

    我一直在尝试使用 ICS 中 ActionBar 中的 setActionView 看起来应该很简单 但不知怎的 我没有得到我希望的布局对齐 正如您在下图中看到的 目标 图标在其布局中正确居中 但是当我 setActionBar progr
  • 为什么新数组很慢?

    比较操作时 var fat cats cats slice to var fat cats new Array cats length 性能差异令人困惑 在 Firefox 和 Chrome 中new Array速度较慢 当它应该更快时 它
  • 如何正确使用__setattr__,避免无限递归

    我想定义一个包含以下内容的类read and write方法 可以按如下方式调用 instance read instance write instance device read instance device write 为了不使用交错
  • 沿一维的 1D 数组和 3D 数组的有效乘积 - NumPy

    我有两个 numpy 数组 一个名为 t 的一维数组 形状为 70L 其元素名为 ti 称为 I 的 3D 数组 形状为 70L 1024L 1024L 每个元素称为 Ii 因此 Ii 的尺寸为 1024L 1024L 我想沿第一维制作两个
  • 如何解决“bash:ls:找不到命令”[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我做错了什么PATH 所以目前如果我输入ls我得到的命令 bash ls command not found 我该如何解决 Restore PATH 最简单的方法是关闭当前的 she
  • SQLAlchemy 相当于 SQL“LIKE”语句

    标签列具有 苹果香蕉橙 和 草莓香蕉柠檬 等值 我想找到 SQLAlchemy 等效语句 SELECT FROM table WHERE tags LIKE banana 我应该传递什么Class query filter 去做这个 每列有
  • Android如何为回收器视图制作自定义滚动条

    我有一个用于回收器视图的自定义垂直滚动条 但用于显示项目位置的拇指有点太大 并且在顶部时处于关闭位置 在styles xml中 我使用thumb xml和track xml文件定义了自定义滚动条 用于自定义轨道和拇指 在 recyler x
  • Android:如何触发软键盘上的任意按键事件?

    有没有办法以编程方式按下 Android 软键盘的按键 就像 当键盘出现时 我想通过我的代码而不是手指按 J 键 第一种方法 IBinder binder ServiceManager getService window IWindowMa
  • fgets 被跳过

    我有一个小程序 我想询问一个选项 然后询问一个文件名 Some code before printf n printf 1 Register a file n printf 2 Get global list n printf 3 Down
  • Java - 无法解析的日期,需要格式匹配“GMT-0400”

    我有以下Java DateFormat formatter new SimpleDateFormat EEE MMM dd yyyy HH mm ss zZ zzzz Locale ENGLISH Calendar cal Calendar
  • Java 加载自定义字体文件 (.ttf)

    我在下面使用了这段代码 它出现了这个堆栈跟踪 java io FileNotFoundException font ttf No such file or directory at java io FileInputStream open
  • Python ctypes:在 c 中调用具有自定义类型的函数

    我正在尝试包裹预先存在的c代码用于 Linux 中的 Python 我对 c 的经验很少 目前我正在使用 ctypes 来解决这个问题 我的 C 函数需要一个带有自定义类型条目的二维数组 我不知道如何在 python 中重新创建它以将其传递
  • 错误“Gradle 同步失败:连接被拒绝:连接”

    所以我过了很长一段时间才再次安装Android Studio 它要求我配置代理 所以我就这么做了 我测试了连接并且成功了 然后它要求我配置 Gradle 的代理设置 我使用了相同的配置 现在 在加载最新的 Vuforia Sample 项目
  • 具有空初始化的对象的生命周期

    当前的标准草案说 以前的标准有类似的措辞 基本生活 1 对象或引用的生命周期是其运行时属性 对象或参考 一个物体被称为非空的 初始化 如果它是类或聚合类型 并且它或其中之一 它的子对象是由一个构造函数而不是一个简单的构造函数初始化的 默认构
  • 如何创建没有任何中间文件的 Hive 表?

    我想创建并填充配置单元表而不从磁盘加载任何内容 具体来说 我有 set idlist 1 2 3 set values 2 3 5 我想创建一个包含 9 行的表 id value 1 2 1 3 1 5 2 2 2 3 2 5 3 2 3
  • main函数可以重载吗?

    两个有效版本main 存在于C int main version 1 int main int argc char argv version 2 但两种过载不能同时共存 为什么不 潜在用例 从终端运行程序时 如果没有传递参数 则调用第一个版
  • Google Analytics 和 __utm.gif 文件

    当使用 Google Analytics 并使用较新的 ga js 文件时 您网站的根目录中是否需要 utm gif 文件 我确实看到我的浏览器对 google analytics com 上的文件进行了调用 http www google
  • 为什么在哈希映射中查找项目比在数组中查找项目更快?

    您可能在某个地方提到过在 hashmap dictionary table 中查找元素比在 list array 中查找元素更快 我的问题是为什么 到目前为止我做出的推论 为什么它应该更快 据我所知 在这两种数据结构中 它必须遍历直到到达所
  • 多个模板匹配仅检测到一个匹配项

    我正在尝试匹配这张图片 在这张图片中 然而 我找不到超过一个的头目敌人 我需要做什么才能找到其他人 图片加载 struct XYposition float X float Y std vector