图像监视:在 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


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

unity C#深拷贝、浅拷贝、直接赋值区别与经典实例

文章目录 浅拷贝深拷贝浅拷贝和直接赋值有啥区别 在C#中&#xff0c;浅拷贝&#xff08;Shallow Copy&#xff09;和深拷贝&#xff08;Deep Copy&#xff09;是两种不同级别的对象复制方式。它们的区别主要体现在处理引用类型字段时的行为。 浅拷贝 浅拷贝是指复制对象时&…

【金猿人物展】DataPipelineCEO陈诚:赋能数据应用,发挥未来生产力

‍ 陈诚 本文由DataPipelineCEO陈诚撰写并投递参与“数据猿年度金猿策划活动——2023大数据产业年度趋势人物榜单及奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 我们处在一个“见证奇迹”的时代。在过去的20年间&#xff0c;我们见证了大数据技术快速发展所带…

VScode全局搜索屏蔽、显示屏蔽指定文件类型及文件夹

1.键盘上按快捷键“ crtl 逗号 ”启动设置界面 crtl ,设置界面显示如下&#xff1a; 2.搜索屏蔽 2.1.输入 search.exclude search.exclude 设置界面显示如下&#xff1a; 2.2. 点击下图红色箭头“Add Pattern”&#xff0c;添加想要屏蔽的文件类型或文件夹 **/*.git *…

做网页抓取时如何处理验证码

网络爬虫是自动从网站提取数据的过程&#xff0c;它已经彻底改变了企业获取信息和获取洞察的方式。然而&#xff0c;为了防止自动化机器人访问网站&#xff0c;CAPTCHA旨在阻碍网络爬虫的工作。在本文中&#xff0c;我们将探讨处理CAPTCHA的有效策略&#xff0c;并介绍Capsolve…

详解Skywalking 服务Overview页面的参数含义(适合小白)

本文针对刚刚接触skywalking的同学&#xff0c;重点讲解服务Overview页面中各个参数的含义&#xff0c;为大家快速上手skywalking会起到帮助作用&#xff01; 最重要的三个指标 Service Apdex&#xff08;数字&#xff09;:当前服务的评分 Successful Rate&#xff08;数字&a…

0104 AJAX介绍

Ajax 的全称是 Asynchronous Javascript And XML &#xff08;异步 JavaScript 和 XML &#xff09;。 通俗的理解&#xff1a;在网页中利用 XMLHttpRequest 对象和服务器进行数据交互的方式&#xff0c;就是 Ajax Ajax 能让我们轻松实现网页与服务器之间的数据交互。 浏览器…

【ceph】在虚拟环境中需要给osd所在的虚拟盘扩容操作

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

国内开源环境漫谈

我国开源软件产业相较于欧美发达国家而言起步相对较晚&#xff0c;开源项目很少超过五年&#xff0c;开发者较年轻。国外很多开源项目都是10年以上的规划与投入。在开源社区发展初期、发展期、协作期、结晶期与流行期的五个阶段中&#xff0c;中国的开源社区平台大多处于前三个…

IDEA新建SpringBoot工程时java版本只有17和21

解决方法&#xff1a;替换源 参考博客&#xff1a;https://www.kuazhi.com/post/712799571.html

数据仓库研发规范

数据仓库研发规范 本文将介绍数据仓库研发规范的阶段规划、角色职责和整体流程。 在大数据时代&#xff0c;规范地进行数据资产管理已成为推动互联网、大数据、人工智能和实体经济深度融合的必要条件。贴近业务属性、兼顾研发各阶段要点的研发规范&#xff0c;可以切实提高研…

c++算法之二分

目录 二分法简介 解题步骤 整数二分 模板 例题 输入描述 输出描述 样例输入输出 解 浮点二分 模板 二分答案&#xff08;最重要&#xff09; 模板 例题 跳石头 题目描述 输入描述 输出描述 输入输出样例 解 例题 肖恩的苹果林 输入描述 输出描述 解 测…

android 13.0 Launcher3长按app弹窗设置为圆角背景功能实现二

1.前言 在13.0的系统ROM定制化开发中,在进行一些Launcher3的定制化开发中,在使用app的弹窗的功能时,会弹出应用信息和 微件之类的内容,所以在定制需求中,需要默认设置为圆角背景,接下来就来分析下相关功能的实现如图: 2.Launcher3长按app弹窗设置为圆角背景功能实现二的…

基于JAVA的固始鹅块销售系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 鹅块类型模块2.3 固始鹅块模块2.4 鹅块订单模块2.5 评论管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 鹅块类型表3.2.2 鹅块表3.2.3 鹅块订单表3.2.4 鹅块评论表 四、系统展示五、核心代码5.…

每日一练:LeeCode-104. 二叉树的最大深度【二叉树】

本文是力扣LeeCode-104. 二叉树的最大深度 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例…

WAMP apache 无法启动(端口 80 未使用)

这段时间系统重装后&#xff0c;安装WAMP Server&#xff0c;装好后点击启动绿了下然后又变成了黄色&#xff0c;托盘图标无论是左键点击还是右键点击都没有反应&#xff0c;wampapache64服务也启动不起来&#xff0c;提示“windows不能在本地计算机启动wampapache”&#xff0…

【npm link】Node命令中的npm link命令的使用,还有CLI全局命令的使用,开发命令行工具必不可少的部分

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;NodeJs &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续前进的勇气…

Mysql查询与更新语句的执行

一条SQL查询语句的执行顺序 FROM&#xff1a;对 FROM 子句中的左表<left_table>和右表<right_table>执行笛卡儿积&#xff08;Cartesianproduct&#xff09;&#xff0c;产生虚拟表 VT1 ON&#xff1a;对虚拟表 VT1 应用 ON 筛选&#xff0c;只有那些符合<join_…

yapi无法注册解决,使用yapi pro即可注册,接口文档生成,java,json

1.气屎我了&#xff0c;直接用yapi pro就可以用&#xff0c;害的我弄了半天 2.地址&#xff1a;https://yapi.pro/login 3.yapi pro比较卡顿。开启无痕模式轻松解决该问题&#xff08;手动狗头&#xff09;祝你开启新大陆 yapi pro yapi

ChatGPT能帮助我们人类做什么

一、ChatGPT可以在多个方面帮助人类&#xff1a; 回答问题&#xff1a; ChatGPT可以回答各种问题&#xff0c;提供信息和解释概念。 创造性写作&#xff1a; 它可以生成文章、故事、诗歌等创意性文本。 学术辅助&#xff1a; ChatGPT可以辅助学术研究&#xff0c;提供解释、背…

DNS解析和主从复制

一、DNS名称解析协议 二、DNS正向解析 三、DNS主从复制 主服务器 从服务器