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


相关推荐

  1. 如何Ubuntu查看内存使用情况?

    2024-01-13 15:08:04       31 阅读
  2. 图像处理图像分割

    2024-01-13 15:08:04       7 阅读
  3. 医疗图像图像语义理解

    2024-01-13 15:08:04       7 阅读
  4. C#使用OpenCV获取图像的轮廓

    2024-01-13 15:08:04       41 阅读
  5. 如何前端优化处理大量的图像资源?

    2024-01-13 15:08:04       39 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-13 15:08:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-13 15:08:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-13 15:08:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-13 15:08:04       20 阅读

热门阅读

  1. 无人驾驶技术在交通领域逐渐成熟

    2024-01-13 15:08:04       34 阅读
  2. UniApp 面试题

    2024-01-13 15:08:04       34 阅读
  3. Redis面试题13

    2024-01-13 15:08:04       28 阅读
  4. Mybatis 37_使用隐式参数名处理多个参数

    2024-01-13 15:08:04       41 阅读
  5. 问题解决记录-pypcd

    2024-01-13 15:08:04       37 阅读
  6. What is `response.isCommitted()` does?

    2024-01-13 15:08:04       38 阅读
  7. 【基础数据结构】栈和队列

    2024-01-13 15:08:04       35 阅读
  8. uniapp搜索附近蓝牙信标(iBeacon)

    2024-01-13 15:08:04       38 阅读