OpenCV 4.12.0
开源计算机视觉
加载中...
搜索中...
无匹配项
图像监视:在 Visual Studio 调试器中查看内存中的图像

上一个教程: 如何在“Microsoft Visual Studio”中使用 OpenCV 构建应用程序
下一个教程: Java 开发入门

原始作者Wolf Kienzle
兼容性OpenCV >= 3.0
警告
本教程可能包含过时的信息。

图像监视是 Microsoft Visual Studio 的一个插件,允许您在调试应用程序时可视化内存中的图像(例如,cv::MatIplImage_ 对象)。这有助于追踪错误,或者仅仅是为了理解给定的代码片段的作用。

先决条件

本教程假设您已具备以下条件

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

安装

下载图像监视安装程序。(Visual Studio 2019 | Visual Studio 2017 | Visual Studio 2012、2013、2015) 安装程序采用带有 .vsix 扩展名的单个文件(Visual Studio 扩展)。要启动它,只需在 Windows 资源管理器中双击 .vsix 文件。安装程序完成后,请务必重新启动 Visual Studio 以完成安装。

示例

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

// Visual Studio 图像监视调试器扩展的测试应用程序
#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
<< "这是 Visual Studio 的图像监视调试器插件的测试程序" << endl
<< "该程序从文件加载图像并运行 Canny 边缘检测器" << endl
<< "没有输出显示或写入磁盘。"
<< "没有输出显示或写入磁盘。"
<< endl
<< "用法:" << endl
<< "image-watch-demo inputimage" << endl
<< "----------------------------------------------------" << endl
<< endl;
}
int main(int argc, char *argv[])
{
help();
if (argc != 2)
{
cout << "参数数量错误" << endl;
return -1;
}
cout << "正在加载输入图像:" << argv[1] << endl;
Mat input;
input = imread(argv[1], IMREAD_COLOR);
cout << "正在检测输入图像中的边缘" << endl;
Mat edges;
Canny(input, edges, 10, 100);
return 0;
}
n 维密集数组类
定义 mat.hpp:830
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
定义 core.hpp:107
STL 命名空间。

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

构建您的解决方案(构建 –> 构建解决方案,或按 F7)。

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

现在在源代码行上设置一个断点,该行显示

Mat edges;

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

在调试器中启动程序(调试 –> 启动调试,或按 F5)。当命中该断点时,程序暂停,Visual Studio 在断点处显示一个黄色指令指针

现在您可以检查程序的状态。例如,您可以调出局部变量窗口(调试 –> 窗口 –> 局部变量),该窗口将显示当前范围内的变量的名称和值

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

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

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

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

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

现在假设您要对 cv::Canny() 实现进行视觉健全性检查。通过在图像列表中选择 edges 图像,将其带入查看器,并放大具有清晰定义的边缘的区域

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

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

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

更多...

图像监视具有许多更高级的功能,例如

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

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