图像监视:在 Visual Studio 调试器中查看内存中图像

先决条件

本教程假定您具有以下可用项:

  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”,然后插入下面的源代码。

Visual Studio Image Watch 调试器扩展的测试应用程序
#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()
使用命名空间 std;
使用命名空间 CV;
无效帮助()
{
cout
<< "----------------------------------------------------"<< endl
<< “This is a test program for the Image Watch Debugger ” << endl
<< “Visual Studio 的插件。程序加载一个“ << endl
<< “图像,然后运行 Canny 边缘检测器。<< endl
<< “不显示任何输出或将任何输出写入磁盘。”
<< endl
<< “用法:” << endl
<< “image-watch-demo inputimage” << endl
<< "----------------------------------------------------"<< endl
<< endl;
}
int main(int argc, char *argv[])
{
help();
如果 (argc != 2)
{
cout << endl <<“参数数量错误”;
返回 -1;
}
cout << “加载输入图像:” << argv[1] << endl;
垫子输入;
输入 = imread(argv[1], IMREAD_COLOR);
cout << “检测输入图像中的边缘” << endl;
垫子边缘;
Canny(输入,边,10,100);
返回 0;
}

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

生成解决方案(生成 –> 生成解决方案,或按 F7)。

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

现在在源代码行上设置一个断点,指出

垫子边缘;

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

在调试器中启动程序(“调试”>“开始调试”,或按 F5)。命中断点时,程序将暂停,Visual Studio 会在断点处显示一个黄色指令指针:

断点 .png

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

vs_locals.png

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

工具窗口.jpg

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

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

查看器.jpg

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

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

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

edges_zoom.png

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

viewer_context_menu.png

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

input_zoom.png

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

更多。。。

图像手表具有许多更高级的功能,例如

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

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

help_button.jpg


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

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

相关文章

【Spring 篇】深入探索:Spring集成Web环境的奇妙世界

嗨&#xff0c;亲爱的小白们&#xff01;欢迎来到这篇有关Spring集成Web环境的博客。如果你曾对如何在Spring中构建强大的Web应用程序感到好奇&#xff0c;那么这里将为你揭示Web开发的神秘面纱。我们将用情感丰富、语句通顺的文字&#xff0c;以小白友好的方式&#xff0c;一探…

survey和surveyCV:如何用R语言进行复杂抽样设计、权重计算和10折交叉验证?

一、引言 在实际调查和研究中&#xff0c;我们往往面临着样本选择的复杂性。复杂抽样设计能够更好地反映真实情况&#xff0c;提高数据的代表性和可靠性。例如&#xff0c;多阶段抽样可以有效地解决大规模调查的问题&#xff0c;整群抽样能够在保证样本的随机性的同时减少资源消…

D25XB100-ASEMI家用电器整流桥D25XB100

编辑&#xff1a;ll D25XB100-ASEMI家用电器整流桥D25XB100 型号&#xff1a;D25XB100 品牌&#xff1a;ASEMI 封装&#xff1a;GBJ-5&#xff08;带康铜丝&#xff09; 平均正向整流电流&#xff08;Id&#xff09;&#xff1a;25A 最大反向击穿电压&#xff08;VRM&…

thinkphp递归实现无限级子分类合并上级children

//设别分类列表public function getCategoryList(){$list = Db::name(categorys)->select(

玩转Mysql 七 (索引的创建与设计原则)

一、索引的创建与使用 1、索引的分类 MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。 &#xff08;1&#xff09;从 功能逻辑 上说&#xff0c;索引主要有 4 种&#xff0c;分别是普通索引、唯一索引、主键索引、全文索引。 &#xff08;…

20_GC垃圾回收机制

文章目录 GC如何确定垃圾如何回收垃圾回收垃圾的时机 GC 如何确定垃圾 引用计数算法 给对象添加一个引用计数器&#xff0c;每当一个地方引用它时&#xff0c;计数器加1&#xff0c;每当引用失效时&#xff0c;计数器减少1&#xff0c;当计数器的数值为0时&#xff0c;也就是对…

Django教程|数据统计图表(echarts、highchart)

前言 highchart&#xff0c;国外。 echarts&#xff0c;国内。 本项目集成 hightchart和echarts图表库实现数据统计功能。 包括&#xff1a;折线图&#xff0c;柱状图&#xff0c;饼图和数据集图。 效果图 echats Highcharts 源代码 编写模板&#xff08;Template&#x…

Docker安装Atlassian全家桶

文章目录 省流&#xff1a;1.docker-compose文件2.其他服务都正常启动&#xff0c;唯独Bitbucket不行。日志错误刚启动时候重启后查询分析原因再针对第一点排查看样子是安装的bitbucket和系统环境有冲突问题&#xff1f; 结论&#xff1a; 省流&#xff1a; bitbucket 只能安装…

idea使用ssh连接docker,并通过Dockerfile文件,直接在idea中启动docker应用,并进行远程debug

idea使用ssh连接docker&#xff0c;并通过Dockerfile文件&#xff0c;直接在idea中启动docker应用&#xff0c;并进行远程debug 第一步: idea通过ssh连接docker第二步&#xff1a;使用Dockerfile文件在远程启动应用第三步: 远程debug 容器运行的好处是减轻本地运行的负担(本地电…

数据结构初探:揭开数据结构奥秘

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、算法模板、汇编语言 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. 数组结构起源二. 基本概念和术语2.1 数据2.2 数据元素2.3 数据项2.4 …

Rust-语句和表达式

if-else Rust中if-else表达式的作用是实现条件分支。if-else表达式的构成方式为&#xff1a;以if关键字开头&#xff0c;后面跟上条件表达式&#xff0c;后续是结果语句块&#xff0c;最后是可选的else块。条件表达式的类型必须是bool。 if-else结构还可以当表达式使用 loop …

苹果手机怎么恢复备份?详细攻略为你整理好了!

随着智能手机和互联网的普及&#xff0c;手机中存储的个人信息、照片、视频、聊天记录等数据会变得越来越多。一旦手机丢失、损坏或系统出现问题&#xff0c;我们很可能会面临数据丢失的风险。因此&#xff0c;越来越多的人开始意识到保护手机数据的重要性。 当苹果手机数据丢…

Mnajora 使用deb包安装软件

说明 Mnajora 安装deb软件包主要有两种方式 可以使用dpkg 直接安装也可是使用debtap将deb软件包转换成 使用dpkg sudo pacman -S dpkg #安装dpkgsudo dpkg -i ###.deb #使用dpkg安装deb软件包和在ubuntu上是一样的 安装成功 使用debtap debtap是一个用于将.deb包转换为A…

C++力扣题目617--合并二叉树

给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新二叉树。合并的规则是&#xff1a;如果两个节点重叠&#…

“+”连接符用法(Java)

""可以作为连接符使用&#xff0c;如果与字符串一起运算&#xff0c;结果依旧是一个字符串 比如"aaa"6 --> "aaa6" 在打印中&#xff0c;能算就算&#xff0c;不能计算的时候就会连接在一起 注意先后顺序 ascii编码&#xff1a; 字符串&…

VASP结合vaspkit+ShengBTE计算热电优值(一)

电导率σ&#xff0c;塞贝克系数S的计算&#xff1a; 使用vaspkit计算处对应的物理量&#xff0c;具体流程为&#xff1a; 准备好计算的材料对应的POSCAR。如果是二维材料可以使用vaspkit 的921或923功能对二维材料POSCAR进行标准化。进行结构优化。使用 vaspkit-681命令生成高…

卡尔曼滤波:理论与代码

卡尔曼滤波&#xff1a;理论与代码 引言 卡尔曼滤波是一种用于估计系统状态的优化技术&#xff0c;特别适用于含有噪声的测量数据和系统动态变化的情况。本文将简单探讨卡尔曼滤波的理论基础、数学公式的推导&#xff0c;并通过Python代码示例演示其在实际应用中的效果。 一…

python,序列的切片

序列的切片就是指从一个序列中取出子序列 语法&#xff1a; 序列[起始下标&#xff1a;结束下标&#xff1a;步长] 步长为1表示一个一个的取元素&#xff0c;步长为2表示每次跳过一个元素的取元素&#xff0c;步长为负数表示反向切片&#xff0c;取元素时取到结束下标&#…

养老数据监控大屏:护航金色晚年,打造智慧养老新标杆

随着老龄化社会的加速到来&#xff0c;养老服务的质量和效率成为了社会关注的焦点。如何运用现代科技手段提升养老服务水平&#xff0c;让老年人享受更加舒适、便捷的晚年生活&#xff0c;成为了我们面临的重要课题。在这一背景下&#xff0c;养老数据监控大屏应运而生&#xf…

2-《Java并发编程实战》(Java Concurrency in Practice) 代码示例

说明 这是针对《Java并发编程实战》(Java Concurrency in Practice)一书中的示例代码进行扩展&#xff0c;并且进行验证的完整代码&#xff0c;具体背景可看这篇文章&#xff1a;1-《Java并发编程实战》(Java Concurrency in Practice) 代码示例 下面的示例代码都是针对书中的&…