OpenCV  4.10.0
开源计算机视觉
加载中...
搜索中...
无匹配项
Image Watch:在 Visual Studio 调试器中查看内存图片

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

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

Image Watch 是 Microsoft Visual Studio 的一个插件,它允许你在调试应用程序时可视化内存图片(例如cv::MatIplImage_ 对象)。这有助于找出错误,或仅仅了解给定的代码执行了什么操作。

必备条件

本教程假定你具备以下条件:

  1. 已安装更新 1 的 Visual Studio 2012 Professional(或更高版本)。更新 1 可在此处下载 here
  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()
using namespace std;
using namespace cv;
void help()
{
cout
<< "----------------------------------------------------" << endl
<< "这个是图像观察调试器的测试程序" << endl
<< "Visual Studio 的插件。该程序从" << endl
<< "文件中加载一个图像并运行 Canny 边缘检测器。" << endl
<< "没有显示或写入到磁盘任何输出。"
<< endl
<< "用法:" << endl
<< "image-watch-demo 输入图像" << 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:812
int main(int argc, char *argv[])
定义 highgui_qt.cpp:3
"黑盒"代表与磁盘上的文件的存储关联。
定义 core.hpp:102
STL 命名空间。

确保活动解决方案配置(生成 -> 配置管理器)被设为调试生成(一般称为“调试”)。这可以禁用编译优化,从而使在调试器中查看变量可靠地工作。

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

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

现在在显示如下的源代码行上设置断点

Mat edges;

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

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

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

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

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

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

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

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

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

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

在相同大小的图像之间翻转时,链接视图功能将视图区域保持固定。若要了解此功能如何运作,请从图像列表中选择输入图像 - 您现在应在输入图像中看到相应的放大区域

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

更多 ...

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

  1. 监视列表中固定图像,以跨作用域或在调试会话之间进行检查
  2. 直接在监视窗口中对图像进行钳位、阈值化或求差
  3. 将内存中的图像与来自文件的参考图像进行比较

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