用 Visual Studio 调试器中查看内存中图像

返回目录:OpenCV系列文章目录(持续更新中......)

前一篇:OpenCV4.9.0在windows系统下的安装

后一篇:  

​警告

本教程可以包含过时的信息。

Image Watch 是 Microsoft Visual Studio 的插件,可用于在调试应用程序时可视化内存中的图像(例如 cv::Mat 或 IplImage_ 对象)这有助于跟踪错误,或者简单地了解给定的代码段正在做什么

先决条件

本教程假定您具备以下条件:

  1. 安装了 Update 1 的Visual Studio 2012 Professional(或更高版本)。更新1可在此处下载。
  2. 在Windows计算机上安装OpenCV(教程:在 Windows 中安装)
  3. 能够在Visual Studio中创建和构建OpenCV项目(教程:如何在“Microsoft Visual Studio”中使用OpenCV构建应用程序)

安装

下载 Image Watch 安装程序。(Visual Studio 2019 |Visual Studio 2017 中文版 |Visual Studio 2012、2013、2015)安装程序位于扩展名为 .vsix(Visual Studio 扩展)的单个文件中。要启动它,只需双击Windows资源管理器中的 .vsix 文件。安装程序完成后,请确保重新启动 Visual Studio 以完成安装

例:

Image Watch适用于使用 OpenCV 图像对象(例如,cv::Mat)的任何现有项目。在此示例中,我们使用一个最小的测试程序,该程序从文件加载图像并运行边缘检测器。若要生成程序,请在 Visual Studio 中创建一个控制台应用程序项目,将其命名为“image-watch-demo”,并在下面插入源代码

​// Test application for the Visual Studio Image Watch Debugger extension
#include <iostream> // std::cout
#include <opencv2/core/core.hpp> // cv::Mat
#include <opencv2/imgcodecs/imgcodecs.hpp> // cv::imread()
#include <opencv2/imgproc/imgproc.hpp> // cv::Canny()
using namespace std;
using namespace cv;
void help()
{
cout
<< "----------------------------------------------------" << endl
<< "This is a test program for the Image Watch Debugger " << endl
<< "plug-in for Visual Studio. The program loads an " << endl
<< "image from a file and runs the Canny edge detector. " << endl
<< "No output is displayed or written to disk."
<< endl
<< "Usage:" << endl
<< "image-watch-demo inputimage" << endl
<< "----------------------------------------------------" << endl
<< endl;
}
int main(int argc, char *argv[])
{
help();
if (argc != 2)
{
cout << "Wrong number of parameters" << endl;
return -1;
}
cout << "Loading input image: " << argv[1] << endl;
Mat input;
input = imread(argv[1], IMREAD_COLOR);
cout << "Detecting edges in input image" << endl;
Mat edges;
Canny(input, edges, 10, 100);
return 0;
}

确保活动解决方案配置(内部版本 –> Configuration Manager)设置为调试版本(通常称为“调试”)。这应该会禁用编译器优化,以便调试器中的查看变量可以可靠地工作

生成解决方案(“生成 >生成解决方案”,或按 F7

在继续之前,不要忘记将输入图像的命令行参数添加到项目中(右键单击项目 –> 属性 –> 配置属性 –>调试,然后使用图像的位置设置字段命令参数)

现在在源行上设置一个断点,上面写着Mat edges;

若要设置断点,请右键单击源行,然后从上下文菜单中选择“断点 –>插入断点”

在调试器中启动程序(Debug –> Start Debugging,或按 F5)。命中断点时,程序将暂停,Visual Studio 会在断点处显示黄色指令指针:

breakpoint.png

现在,您可以检查程序的状态。例如,您可以打开“局部变量”窗口(“调试”>“Windows ”–“>局部变量”),该窗口将显示当前作用域中变量的名称和值:

vs_locals.png

​请注意,内置的“局部变量”窗口将仅显示文本。这就是 Image Watch 插件的用武之地。Image Watch 就像另一个 Locals 窗口,但内置了一个图像查看器。若要调出“图像监视”,请选择“视图”->“其他窗口”->“图像监视”。与 Visual Studio 的“局部变量”窗口一样,Image Watch 可以停靠到 Visual Studio IDE。此外,Visual Studio 还会记住你是否打开了图像监视,以及它在调试会话之间的位置。这意味着您只需执行一次此操作 - 下次开始调试时,Image Watch 将返回到您离开的位置。下面是停靠的 Image Watch 窗口在断点处的样子:

toolwindow.jpg

左上角的单选按钮 (Locals/Watch) 选择下面的图像列表中显示的内容:Locals 列出当前范围内的所有 OpenCV 图像对象(此列表会自动填充)。监视显示已固定以进行连续检查的图像表达式(此处未介绍,有关详细信息,请参阅图像监视文档)。图像列表显示基本信息,例如宽度、高度、通道数以及缩略图(如果可用)。在我们的示例中,图像列表包含我们的两个局部图像变量,即输入边缘

如果图像有缩略图,左键单击该图像将在右侧的图像查看器中选择该图像进行详细查看。查看器允许您平移(拖动鼠标)和缩放(鼠标滚轮)。它还显示当前鼠标位置的像素坐标和值。

viewer.jpg

请注意,列表中的第二张图像“边缘”显示为“无效”。这表示此图像对象的某些数据成员具有损坏或无效的值(例如,负图像宽度)。这在程序的这一点上是预期的,因为边缘的C++构造函数尚未运行,因此其成员具有未定义的值(在调试模式下,它们通常填充“0xCD”字节)。

从这里,您可以单步执行代码(Debug->Step Over,或按 F10)并观察像素变化:如果单步执行一次,则 Mat edges; 语句,边缘图像将从“invalid”变为“empty”,这意味着它现在处于有效状态(默认构造),即使它尚未初始化(使用 cv::例如,Mat::create())。如果在 cv::Canny() 调用上再执行一步,您将看到边缘图像的缩略图出现在图像列表中。

现在假设你想对 cv::Canny() 实现进行可视化健全性检查。通过在“图像列表”中选择边缘图像,将边缘图像带入查看器,并放大到具有明确定义边缘的区域:

edges_zoom.png

右键单击图像查看器以调出视图上下文菜单并启用链接视图(菜单项旁边的复选框指示是否启用该选项)。

viewer_context_menu.png

“链接视图”功能在相同大小的图像之间切换时使视图区域保持固定。要查看其工作原理,请从图像列表中选择输入图像 - 您现在应该在输入图像中看到相应的放大区域:

input_zoom.png

​您还可以使用向上/向下光标键在查看输入和边缘之间来回切换。这样,您就可以轻松验证检测到的边缘是否与输入图像中的数据很好地对齐。

更多 ...

Image Watch 具有许多更高级的功能,例如

  1. 将映像固定到监视列表,以便跨作用域或调试会话之间进行检查
  2. 直接在“监视”窗口内对图像进行钳位、阈值设置或差异
  3. 将内存中映像与文件中的参考映像进行比较

有关详细信息,请参阅在线图像监视文档 - 您也可以通过单击图像监视窗口中的帮助链接访问文档页面:

help_button.jpg

 参考文献: 

《Image Watch: viewing in-memory images in the Visual Studio debugger 》Wolf Kienzle

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2869375.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

网络安全——关于防火墙

网络安全防火墙是很重要的部分&#xff0c;关于防火墙我们要知道&#xff0c;他默认所有流量都是黑名单&#xff0c;只有开启允许通过才可以。 我们通过一个实验来学防火墙命令。 防火墙要登录才能使用&#xff0c;用户名是admin,默认密码是Admin123&#xff0c;在第一次登录…

【视频异常检测】Diversity-Measurable Anomaly Detection 论文阅读

Diversity-Measurable Anomaly Detection 论文阅读 Abstract1. Introduction2. Related Work3. Diversity-Measurable Anomaly Detection3.1. The framework3.2. Information compression module3.3. Pyramid deformation module3.4. Foreground-background selection3.5. Trai…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Stack)

堆叠容器&#xff0c;子组件按照顺序依次入栈&#xff0c;后一个子组件覆盖前一个子组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 可以包含子组件。 接口 Stack(value?: { ali…

【数据结构和算法初阶(C语言)】队列实操(概念实现+oj题目栈和队列的双向实现以及循环链表难点题目详解!)

目录 1. 队列的概念及结构 2.队列结构存在的意义应用 3.队列实现的结构选择 4.队列实现 5.队列对数据的处理 5.1队列初始化 5.2队尾入数据 5.3队头出数据 5.4获取队列尾部元素 5.5获取队列头部元素 5.6获取队列中元素个数 5.7检测队列是否为空 5.8销毁队列 6.循环队列补充 7.使…

计算机组成原理 第五章(计算机的运算方法)—第一节(无符号数和有符号数)

写在前面&#xff1a; 本系列笔记主要以《计算机组成原理&#xff08;唐朔飞&#xff09;》为参考&#xff0c;大部分内容出于此书&#xff0c;笔者的工作主要是挑其重点展示&#xff0c;另外配合下方视频链接的教程展开思路&#xff0c;在笔记中一些比较难懂的地方加以自己的…

zookeeper快速入门一:zookeeper安装与启动

本文是zookeeper系列之快速入门中的第一篇&#xff0c;欢迎大家观看与指出不足。 写在前面&#xff1a; 不影响教程&#xff0c;笔者安装zookeeper用的是WSL(windows下的linux子系统&#xff09;&#xff0c;当然你想直接在windows上用zookeeper也是可以的。 如果你也想用ws…

高效使用 JMeter 生成随机数:探索 Random 和 UUID 算法

在压力测试中&#xff0c;经常需要生成随机值来模拟用户行为。JMeter 提供了多种方式来生成随机值&#xff0c;本文来具体介绍一下。 随机数函数 JMeter 提供了多个用于生成随机数的函数&#xff0c;其中最常用的是__Random函数。该函数可以生成一个指定范围内的随机整数或浮…

基于FPGA的光纤通信系统设计

文章目录 光纤通信系统的组成发送端FPGA端口定义状态机设计代码示例 接收端功能模块端口定义状态机设计 光纤通信系统的组成 发送端FPGA 发送控制逻辑、数据编码、校验码生成、缓存控制、时钟控制 端口定义 状态机设计 代码示例 接收端功能模块 接收端控制逻辑、数据解码、…

线性表——带头循环双向链表的增删查改

本节复习带头循环双向链表的增删查改。 带头循环双向链表的结构很完美&#xff0c; 是我们日常生活中使用最多的一种链表的形式。 但是考的频率要少于单链表。 目录 双链表的全部接口 准备文件 建立双链表的结构体蓝图 创建返回链表的头节点 申请新节点函数接口 双向链表…

Uniapp有奖猜歌游戏系统源码,附带流量主

有奖猜歌游戏是一款基于uni-app、uniCloud、uniAD 开发的小游戏&#xff0c;通过猜歌曲、观看广告赚取现金奖励。 游戏基本特征 玩家可以通过猜歌、做任务等方式直接获取现金奖励 玩家可以通过猜歌、拆红包、做任务等方式获取金币奖励&#xff0c;当金币累积到一定数量可以兑…

9.用FFmpeg测试H.264文件的解码时间

1. Essence of Method 要测试对H.264文件的解码时间&#xff0c;可以使用FFmpeg进行操作。FFmpeg是一个开源的多媒体处理工具&#xff0c;可以用来处理视频和音频文件&#xff0c;包括解码H.264文件。以下是使用FFmpeg的命令行来测试解码时间的方法&#xff1a; ffmpeg -i in…

Java高级互联网架构师之路:排查当前JVM错误的步骤

程序 这个程序是有问题的,我们通过一些命令来分析这个程序究竟是哪里出了问题。首先把当前的程序通过SSH工具传输到centos系统中,之后我们就可以在linux环境下编译和执行。 注意一点:上面类的名字是Z,但是在linux环境下,我们将其改为了AA,并且文件名改为了AA,所以文章下…

GiT: Towards Generalist Vision Transformer through Universal Language Interface

GiT: Towards Generalist Vision Transformer through Universal Language Interface 相关链接&#xff1a;arxiv github 关键字&#xff1a;Generalist Vision Transformer (GiT)、Universal Language Interface、Multi-task Learning、Zero-shot Transfer、Transformer 摘要 …

Java项目:57 ssm011线上旅行信息管理系统ssm+vue

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 本线上旅行信息管理系统&#xff0c;主要实现了用户功能模块和管理员功能模块两大部分 用户可查看旅行相关信息&#xff0c;注册登录后还可实…

简易版 RPC 框架实现 2.0 -netty实现

这一篇理解如果有难度&#xff0c;可能对netty不是很理解&#xff0c; 可以关注我netty专栏&#xff0c;还有另外一篇&#xff1a; 用 Netty 自己实现简单的RPC&#xff0c; 这一篇是学习netty的时候写的&#xff0c;更倾向于分析netty相关的知识&#xff0c; 今天我是学习dubb…

java:Druid工具类解析sql获取表名

java&#xff1a;Druid工具类解析sql获取表名 1 前言 alibaba的druid连接池除了sql执行的功能外&#xff0c;还有sql语法解析的工具提供&#xff0c;参考依赖如下&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>druid</ar…

使用paho.mqtt.client实现MQTT Client连接物联网平台(ThingsCloud)

目录 概述 1 ThingsCloud平台上创建项目 1.1 创建项目 1.2 配置App UI 2 认识paho.mqtt.client 3 实现MQTT Client 3.1 实现的接口介绍 3.2 paho.mqtt.client库函数介绍 3.3 MQTT Client类实现 3.3.1 创建项目 3.3.2 编写MQTT Client类代码 3.3.3 Log工具源码 4 实…

客户端:Vue3,服务端:Node,基于Socket.IO实现单聊的功能

目录 1.介绍 2.环境搭建 3.本功能实现的主要逻辑 4.客户端和服务端的主要代码 5.效果展示 6.socket.io的运作原理 1.介绍 本篇主要讲讲基于Socket.IO实现单聊功能的主要实现&#xff0c;包括了客户端和服务端Node。 在这个即时通讯无处不在的时代&#xff0c;实时聊天功能…

Java面试题总结18之springcloud四种分布式事务解决方案

XA规范&#xff1a;分布式事务规范&#xff0c;规定了分布式事务模型 四个角色&#xff1a;事务管理器&#xff08;协调者TM&#xff09;&#xff0c;资源管理器&#xff08;参与者RM&#xff09;&#xff0c;应用程序AP&#xff0c;通信资源管理器CRM 全局事务&#xff1a;一…

【Hadoop大数据技术】——MapReduce分布式计算框架(学习笔记)

&#x1f4d6; 前言&#xff1a;MapReduce是Hadoop系统核心组件之一&#xff0c;它是一种可用于大数据并行处理的计算模型、框架和平台&#xff0c;主要解决海量数据的计算问题&#xff0c;是目前分布式计算模型中应用较为广泛的一种。 目录 &#x1f552; 1. MapReduce概述&am…