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

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

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

后一篇:OpenCV-Java 开发简介  

​警告

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

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://www.mfbz.cn/a/463174.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥:保险箱(Python,动态规划)

问题描述&#xff1a; 小蓝有一个保险箱&#xff0c;保险箱上共有 n 位数字。小蓝可以任意调整保险箱上的每个数字&#xff0c;每一次操作可以将其中一位增加 1 或减少 1。当某位原本为 9 或 0 时可能会向前&#xff08;左边&#xff09;进位/退位&#xff0c;当最高位&#x…

Rancher操作手册(v2.7.5-rc1)

1.登录 访问地址&#xff1a;10.66.55.132使用账号和密码登录。初始的页面是英文版本&#xff0c;可以点击左下方改为简体中文 登录成功后可以看到现有的集群。右上角可以进行新集群的创建和导入已有集群。点击箭头所指的蓝色集群名称可以进入集群。 2.集群仪表盘 进入到集…

Tuxera NTFS 2023安装使用教程 Tuxera NTFS破解版 Tuxera NTFS for Mac优惠

对于必须在Windows电脑和Mac电脑之间来回切换的Mac朋友来说&#xff0c;跨平台不兼容一直是一个巨大的障碍&#xff0c;尤其是当我们需要使用NTFS格式的硬盘在Windows和macOS之间共享文件时。因为Mac默认不支持写入NTFS磁盘。 为了解决这一问题&#xff0c;很多朋友会选择很便捷…

Simulink|局部遮荫下光伏组件多峰值PSO-MPPT控制

目录 主要内容 1.光伏电池工程数学模型的输出特性程序 2.普通扰动观察法进行MPPT 3.基于粒子群寻优的多峰输出特性 4.PSO_MPPT仿真模型 程序下载链接 主要内容 在实际的光伏发电系统中,由于环境多变等因素的影响,当局部出现被遮挡情况时光伏阵列的功率-电压(P-U)特…

SQLiteC/C++接口详细介绍之sqlite3类(十七)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十六&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍之sqlite3类&#xff08;十八&#xff09; ​ 53.sqlite3_trace_v2 函数功能&#x…

【ArcGISPro】道路数据下载并使用

下载 下载链接: Geofabrik 下载服务器 这些数据通常 每天更新。 下载结果 arcmap用户下载工具 10.2:http://www.arcgis.com/home/item.html?id=16970017f81349548d0a9eead0ebba39 10.3:

最细节操作 Linux LVM 逻辑卷管理

Linux LVM&#xff08;逻辑卷管理&#xff09; 周末愉快&#xff0c;今天带大家实战一下LVM! 一、LVM理论 LVM&#xff0c;即Logical Volume Manager&#xff0c;逻辑卷管理器&#xff0c;是一种硬盘的虚拟化技术&#xff0c;可以允许用户的硬盘资源进行灵活的调整和动态管理…

Git版本管理--远程仓库

前言&#xff1a; 本文记录学习使用 Git 版本管理工具的学习笔记&#xff0c;通过阅读参考链接中的博文和实际操作&#xff0c;快速的上手使用 Git 工具。 本文参考了引用链接博文里的内容。 引用: 重学Git-Git远程仓库管理_git remote add origin-CSDN博客 Git学习笔记&am…

27-Java MVC 模式

Java空对象模式 实现范例 MVC模式代表 Model-View-Controller&#xff08;模型-视图-控制器&#xff09; 模式MVC模式用于应用程序的分层开发 Model&#xff08;模型&#xff09; - 模型代表一个存取数据的对象或 JAVA POJO 它也可以带有逻辑&#xff0c;在数据变化时更新控制…

【系统架构设计师】系统工程与信息系统基础 01

系统架构设计师 - 系列文章目录 01 系统工程与信息系统基础 文章目录 系列文章目录 前言 一、系统工程 ★ 二、信息系统生命周期 ★ 信息系统建设原则 三、信息系统开发方法 ★★ 四、信息系统的分类 ★★★ 1.业务处理系统【TPS】 2.管理信息系统【MIS】 3.决策支持系统…

由浅到深认识C语言(11):结构体

该文章Github地址&#xff1a;https://github.com/AntonyCheng/c-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.csdn…

提升物流效率,快递平台实战总结与分享

随着电商行业的蓬勃发展&#xff0c;物流配送服务变得愈发重要。快递平台作为连接电商企业和消费者的桥梁&#xff0c;扮演着至关重要的角色。本篇博客将分享快递平台实战经验&#xff0c;总结关键要点&#xff0c;帮助物流从业者提升物流效率、优化服务质量。 ### 快递平台实…

小米Mini路由器刷Openwrt

前言 在我们使用路由器&#xff0c;会有把想要的路由器修改为openwrt后使用&#xff0c;今天这里分享了一下小米mini&#xff0c;但是总体小米路由器基本都是一样的操作&#xff0c;先进行回退某个可以支持ssh的版本&#xff0c;再使用注入命令&#xff0c;最后烧录breed和ope…

微信小程序开发系列(三十四)·自定义组件的创建、注册以及使用(数据和方法事件的使用)

目录 1. 分类和简介 2. 公共组件 2.1 创建 2.2 注册 2.3 使用 3. 页面组件 3.1 创建 3.2 注册 3.3 使用 4. 组件的数据和方法的使用 4.1 组件数据的修改 4.2 方法事件的使用 1. 分类和简介 小程序目前已经支持组件化开发&#xff0c;可以将页面中的功能…

深度解析:如何运用山海鲸可视化软件制作高效销售数据看板

在数字化时代&#xff0c;数据可视化已经成为企业决策和运营的重要工具。作为一名长期使用山海鲸可视化软件的资深用户&#xff0c;我深知其在制作销售数据可视化看板方面的优势。今天&#xff0c;我想分享一些我在使用山海鲸可视化软件制作销售数据可视化看板过程中的经验和感…

面向控制台编程?Java的GUI开发

记得之前刚开始学习Java&#xff0c;按部就班去阅读《Java核心技术》这本书的时候&#xff0c;总是听别人提起&#xff0c;java swing那一章不用看了。然后直到对着控制台编程了半年&#xff0c;回来捡起了Swing图形界面&#xff0c;跟着网上搞了坦克大战的游戏&#xff0c;总觉…

抖去推无人直播+矩阵托管+AI文案撰写一体化工具如何开发搭建

一、 开发和搭建抖去推无人直播矩阵托管AI文案撰写一体化工具需要以下步骤&#xff1a; 确定功能需求&#xff1a;确定抖去推无人直播、矩阵托管和AI文案撰写的具体功能需求&#xff0c;如直播推流、直播管理、托管服务、AI文案生成等。 技术选型&#xff1a;选择适合开发该工…

Spring Boot 中的 Sleuth 详解

Spring Boot 中的 Sleuth 是一个用于分布式追踪的库&#xff0c;它可以帮助你追踪和理解分布式系统中的请求如何跨越多个服务和网络调用。通过使用 Sleuth&#xff0c;你可以收集关于请求路径、延迟、异常等的信息&#xff0c;从而更容易地诊断问题并进行性能优化。 一、下面是…

ArcGIS分享图层数据的最佳方法

在工作中&#xff0c;经常需要将图层数据分享给其他人。 如下图所示&#xff0c;需要分享的是【CJDCQ】和【GHDLTB】&#xff0c;图层带有符号系统&#xff1a; 一、分享gdb数据库及lyr文件 分享数据自然要找到源数据&#xff1a; 但是&#xff0c;gdb数据是不带符号系统的&a…

软考高级:软件工程瀑布模型概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…
最新文章