OpenCV:断言失败((img.深度()== CV_8U || img.深度()== CV_32F)&& img.type()== templ.type())

2024-04-05

我从上面得到这个错误,不知道如何避免它。 我的目的是获取屏幕截图,然后对其进行模板匹配,看看此时屏幕上是否显示图标。到目前为止,这只是图标的位置。 我的代码:

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/core/core.hpp"
#include <Windows.h>
#include <iostream>
#include <stdio.h>
#include <string>


using namespace std;
using namespace cv;

Mat hwnd2mat();

/// Global Variables
Mat img; Mat templ; Mat result;

int main()
{
  /// Load image and template
  templ = imread( "Template.bmp",1);
  templ.convertTo(templ, CV_8U);

  //img = imread( "Image.jpg", 1 );
  img = hwnd2mat();


  /// Create the result matrix
  int result_cols =  img.cols - templ.cols + 1;
  int result_rows = img.rows - templ.rows + 1;

  result.create( result_cols, result_rows, CV_8U);

  /// Do the Matching and Normalize
  matchTemplate( img, templ, result, CV_TM_SQDIFF );
  normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() );

  /// Localizing the best match with minMaxLoc
  double minVal; double maxVal; Point minLoc; Point maxLoc;
  Point matchLoc;

  minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );

  /// show best position
  matchLoc = minLoc;
  cout<<matchLoc<<" is best position"<<endl;

  waitKey(0);
  return 0;
}

Mat hwnd2mat(){

    HWND hwnd = GetDesktopWindow();
    HDC hwindowDC,hwindowCompatibleDC;

    int height,width,srcheight,srcwidth;
    HBITMAP hbwindow;
    Mat src;
    BITMAPINFOHEADER  bi;

    hwindowDC=GetDC(hwnd);
    hwindowCompatibleDC=CreateCompatibleDC(hwindowDC);
    SetStretchBltMode(hwindowCompatibleDC,COLORONCOLOR);  

    RECT windowsize;    // get the height and width of the screen
    GetClientRect(hwnd, &windowsize);

    srcheight = windowsize.bottom;
    srcwidth = windowsize.right;
    height = windowsize.bottom/1;  //change this to whatever size you want to resize to
    width = windowsize.right/1;

    src.create(height,width,CV_8U);

    // create a bitmap
    hbwindow = CreateCompatibleBitmap( hwindowDC, width, height);
    bi.biSize = sizeof(BITMAPINFOHEADER);
    bi.biWidth = width;    
    bi.biHeight = -height;  //this is the line that makes it draw upside down or not
    bi.biPlanes = 1;    
    bi.biBitCount = 32;    
    bi.biCompression = BI_RGB;    
    bi.biSizeImage = 0;  
    bi.biXPelsPerMeter = 0;    
    bi.biYPelsPerMeter = 0;    
    bi.biClrUsed = 0;    
    bi.biClrImportant = 0;

    // use the previously created device context with the bitmap
    SelectObject(hwindowCompatibleDC, hbwindow);
    // copy from the window device context to the bitmap device context
    StretchBlt( hwindowCompatibleDC, 0,0, width, height, hwindowDC, 0, 0,srcwidth,srcheight, SRCCOPY); //change SRCCOPY to NOTSRCCOPY for wacky colors !
    GetDIBits(hwindowCompatibleDC,hbwindow,0,height,src.data,(BITMAPINFO *)&bi,DIB_RGB_COLORS);  //copy from hwindowCompatibleDC to hbwindow

    DeleteObject(hbwindow);
    DeleteDC(hwindowCompatibleDC);
    ReleaseDC(hwnd, hwindowDC);

    return src;
}

截图的功能不是我自己的作品,是我从here https://stackoverflow.com/questions/14148758/how-to-capture-the-desktop-in-opencv-ie-turn-a-bitmap-into-a-mat

有什么想法要做什么吗?

感谢您的帮助,最诚挚的问候!


问题是这个函数hwnd2mat返回类型的灰度图像CV_8UC1 while templ是类型的彩色图像CV_8UC3。所以断言在函数上失败了matchTemplate由于条件失败img.type() == templ.type()。您可以将图像加载为灰度以避免错误。

templ = imread( "Template.bmp",CV_LOAD_IMAGE_GRAYSCALE);

UPDATE:

值得注意的是,该函数hwnd2mat无法以其当前形式工作,并且返回无效图像。原始代码创建类型的输出图像CV_8UC4这是正确的做法。

src.create(height,width,CV_8UC4);

您可以转换src返回之前为灰度hwnd2mat,或者你可以转换templ至 4 通道图像。无论如何,重点是两个图像必须具有相同的类型matchTemplate上班。

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

OpenCV:断言失败((img.深度()== CV_8U || img.深度()== CV_32F)&& img.type()== templ.type()) 的相关文章

  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 函数参数的默认参数是否被视为该参数的初始值设定项?

    假设我有这样的函数声明 static const int R 0 static const int I 0 void f const int r R void g int i I 根据 dcl fct default 1 如果在参数声明中指
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • unordered_map 中字符串的 C++ 哈希函数

    看起来 C 标准库中没有字符串的哈希函数 这是真的 在任何 c 编译器上使用字符串作为 unordered map 中的键的工作示例是什么 C STL提供模板专业化 http en cppreference com w cpp string
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 为什么可以通过ref参数修改readonly字段?

    考虑 class Foo private readonly string value public Foo Bar ref value private void Bar ref string value value hello world
  • 打破 ReadFile() 阻塞 - 命名管道 (Windows API)

    为了简化 这是一种命名管道服务器正在等待命名管道客户端写入管道的情况 使用 WriteFile 阻塞的 Windows API 是 ReadFile 服务器已创建启用阻塞的同步管道 无重叠 I O 客户端已连接 现在服务器正在等待一些数据
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • 等待 IAsyncResult 函数直至完成

    我需要创建等待 IAsyncResult 方法完成的机制 我怎样才能做到这一点 IAsyncResult result contactGroupServices BeginDeleteContact contactToRemove Uri
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析
  • 是否可以在不连接数据库的情况下检索 MetadataWorkspace?

    我正在编写一个需要遍历实体框架的测试库MetadataWorkspace对于给定的DbContext类型 但是 由于这是一个测试库 我宁愿不连接到数据库 它引入了测试环境中可能无法使用的依赖项 当我尝试获取参考时MetadataWorksp
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string

随机推荐

  • 在 Windows 中批量将 cp1252 转换为 utf-8

    所以 我一直在尝试使用我在网上找到的提示和矩阵 将大型java源代码树从cp1252转换为Windows中的UTF 8 特别是here https stackoverflow com a 9310774 问题是 我在 Windows 上 我
  • 将 Select 语句放在 Hibernate 事务上

    我已经阅读了一段时间有关 Hibernate 的内容 但我似乎无法理解有关 Hibernate 的一个概念Transaction 在我访问过的一些网站上 Select语句处于事务模式是这样的 public List
  • 使用短语构建语料库

    我的文件如下 doc1 very good very bad you are great doc2 very bad good restaurent nice place to visit 我想让我的语料库与 这样我的最后DocumentT
  • 将点云转换为深度/多通道图像

    我有一个通过使用立体相机扫描平面生成的点云 我已经生成了法线 fpfh 等特征 并使用这些信息我想对点云中的区域进行分类 为了能够使用更传统的 CNN 方法 我想将此点云转换为 opencv 中的多通道图像 我将点云折叠到 XY 平面 并与
  • 如何在 Safari HTML5 中启用表格行的重影效果?

    当我拖动项目时没有重影效果 table行 在 Safari 上 我用table所以这是一个tr 幻影效果是指您可以看到跟随鼠标移动的项目 在 Chrome FF 上它可以工作 有人知道为什么吗 我注意到它不仅在tr td 如果我使用li o
  • RSA 加密 AES 密钥的强度

    我目前正在开发一个在客户端和服务器之间传输数据的系统 并且想知道我计划使用的加密强度是多少 我的想法是拥有一个私钥 公钥 RSA 密钥对 并将公钥分发给每个客户端 将私钥仅保留在服务器上 然后 每个客户端将生成自己的 AES 密钥并使用 R
  • 绝对定位与固定定位

    我有一个自定义对话框 当我单击按钮时会显示该对话框 显示对话框后 我会显示一个覆盖图 覆盖层的高度和宽度为100 x 100 问题来了 高度 100 只是获取浏览器窗口的高度 所以当我在页面上向下滚动时 它仍然位于顶部 如何将其高度设置为整
  • 如何获取C中最右边设置位的位置

    int a 12 例如 12 的二进制是 1100 所以答案应该是 3 因为设置了右起第 3 位 我想要最后一个最设置位的位置a 谁能告诉我该怎么做 NOTE 我只想要位置 在这里我不想设置或重置该位 所以它与 stackoverflow
  • 如何对我的方法输入参数设置验证约束?

    以下是实现此目标的典型方法 public void myContractualMethod final String x final Set
  • Android:带有 com.android.email 的 ACTION_SEND_MULTIPLE

    我正在尝试将 Intent 中的多个附件发送到电子邮件应用程序 而不是 Gmail 应用程序 我在用着 Intent emailIntent new Intent android content Intent ACTION SEND MUL
  • 在 docker exec 命令中使用“*”

    我正在尝试在运行的 docker 容器中运行特定命令 Docker exec t containername1 ls tmp sth 作为回报我收到 ls cannot access tmp sth No such file or dire
  • 伊莎贝尔语中“case _ of _”是什么意思

    在读的时候这个关于商类型的答案 https stackoverflow com a 67237629 14656198 我偶然发现了这个结构 case of 经检查手册 https isabelle in tum de doc isar r
  • Bootstrap - 谁能给我任何例子,如何设置 JS 按钮?

    我正在玩 Bootstrap有状态按钮 http twitter github com bootstrap javascript html buttons 特别是与加载状态 但仍然找不到正确的设置来使其正常工作 我有一个基于 AJAX 的简
  • tcl 暂停并等待按键继续

    我正在 tcl 中寻找一种方法来暂停脚本 例如在使用 puts 进行一些输出之后 并等待用户按下按键 然后再继续输出剩余的文本 你只需使用gets从标准输入读取 proc pause message Hit Enter to continu
  • 如何定义正则表达式(preg_replace)以删除数字字符之间的空格

    我有这样的字符串 str old iccid 809831 3245 345 new iccid 999000 112221 如何定义正则表达式以删除 PHP 中数字字符之间的空格字符 成为此输出 output old iccid 8098
  • 删除了 C# 和 IoC 传递依赖项

    我有一个使用 IoC windsor 的解决方案 解决方案中的项目如下 接口 保存我将使用的所有接口合约 IoC Installers 保存我的依赖项的所有安装程序 参考实现和接口 IoC 包含一个包含 IoC 容器的单例类 该类执行容器的
  • 如何确定 fgets 是否在读取所有字母之前停止?

    我做了这样的事情 char buf 100 int n 0 char save 100 100 while fgets buf 100 file NULL strcpy save n buf printf s buf n 我开了一个FILE
  • 如何避免“WindowsError:[错误5]访问被拒绝”

    有重新创建文件夹的脚本 Remove folder if exists with all files if os path isdir str os path realpath my folder shutil rmtree os path
  • 安卓框架

    如果有人问我以下问题 Android 框架是什么 它有什么作用 我该怎么回答呢 另外 API 例如活动管理器 位置管理器等 在框架中的作用是什么 What an Android Framework is What does it do 支持
  • OpenCV:断言失败((img.深度()== CV_8U || img.深度()== CV_32F)&& img.type()== templ.type())

    我从上面得到这个错误 不知道如何避免它 我的目的是获取屏幕截图 然后对其进行模板匹配 看看此时屏幕上是否显示图标 到目前为止 这只是图标的位置 我的代码 include opencv2 highgui highgui hpp include