1. OpenCV 4.2.0 图像监视 —— 在 Visual Studio 调试器中查看内存中的图像(OpenCV 官方文档翻译)

官方文档链接:https://docs.opencv.org/4.2.0/d4/d14/tutorial_windows_visual_studio_image_watch.html


图像监视是 Microsoft Visual Studio 的一个插件,可以用于在调试应用程序时可视化内存中的图像。(例如,cv::Mat 或者 IplImage_ 对象)。可以有效地跟踪漏洞或者简单的理解代码功能。


先决条件 (Prerequisites)

你需要具备的条件:

  1. Visual Studio 2012 专业版或者更高版本。
  2. 已经安装了 OpenCV
  3. 具备在 Visual Studio 中创建 OpenCV 项目的能力

安装 (Installation)

这里下载图像监视安装器。安装器是一个单独的文件,扩展名为 .vsix (Visual Studio 的扩展程序)。直接在 Windows 资源管理器中双击 .vsix 文件来启动它。当安装完毕,重启 Visual Studio 来完成安装。

注意
在 Visual Studio 2019 Professional 版本中,可能采用上述方式无法安装图像监控器,可采用如下方式:

  1. 点击 Visual Studio 2019 界面上部的 “扩展” --> “管理扩展”
    在这里插入图片描述

  2. 在新窗口中选择 “联机”,在右上角搜索栏中输入 “Image Watch”
    在这里插入图片描述

  3. 点击 “Image Watch 2019” 并下载安装即可


示例 (Example)

图像监视器适用于使用 OpenCV 图像对象 (例如:cv::Mat) 的现有项目。在这个示例中,我们使用最小的测试程序来从文件中加载图像并运行边缘检测。为了开发这个程序,需要在 Visual Studio 中创建控制台应用程序,命名为 “image-watch-demo” ,并插入如下代码。

示例代码

// Test application for the Visual Studio Image Watch Debugger extension
#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()
#include <opencv2/highgui/highgui.hpp>      // cv::imshow(), cv::waitKey()
using namespace std;
using namespace cv;
void help()
{
    cout
        << "----------------------------------------------------" << endl
        << "This is a test program for the Image Watch Debugger " << endl
        << "plug-in for Visual Studio. The program loads an     " << endl
        << "image from a file and runs the Canny edge detector. " << endl
        << "No output is displayed or written to disk."
        << endl
        << "Usage:" << endl
        << "image-watch-demo inputimage" << endl
        << "----------------------------------------------------" << endl
        << endl;
}
int main(int argc, char* argv[])
{
    help();
    if (argc != 2)
    {
        cout << "Wrong number of parameters" << endl;
        return -1;
    }
    cout << "Loading input image: " << argv[1] << endl;
    Mat input;
    input = imread(argv[1], IMREAD_COLOR);
    cout << "Detecting edges in input image" << endl;
    Mat edges;
    Canny(input, edges, 10, 100);

    imshow("input", input);
    waitKey(0);
    return 0;
}

请确保你的活动解决方案配置(生成 -> 配置管理器)设置为调试构建(通常称为“调试”)。

构建你的解决方案(生成 -> 生成解决方案)

在继续之前,先要在 VS 中添加命令行参数,也就是程序中要使用的输入图像(右键项目 -> 属性 -> 配置属性 -> 调试,在 “命令参数” 中填写图像文件位置。

在这里插入图片描述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sGxYVGhP-1584098454057)(02CCB6A46717444E93E978A8EA52C862)]

运行结果
在这里插入图片描述

现在在如下行前面加断点。

Mat edges;

在这一行上右键,在右键菜单中选择 “断点” -> “插入断点” 来添加断点。

在调试器中启动程序(调试 -> 开始调试,或者按 F5)。当运行到断点,程序会暂停。此时,Visual Studio 会在断点处显示黄色指令指针:
在这里插入图片描述
现在可以查看程序的状态。例如,可以打开本地窗口(调试 -> 窗口 -> 自动窗口),VS 将显示当前范围内的变量的名称和值。
在这里插入图片描述
注意,内置的 “自动窗口” 将只显示文本。使用 Image Watch 插件,像是使用另一个 “自动窗口”,但内置了图像查看器。选择 “视图” -> “其他窗口” -> “Image Watch” 将运行 Image Watch。
在这里插入图片描述
像是 Visual Studio 的自动窗口一样,Image Watch 可以停靠在 Visual Studio IDE 中。
在这里插入图片描述
此外,Visual Studio 将记录是否打开过 Image Watch,以及它在调试会话之间的位置。这意味着你只需要打开一次,下一次你启动调试时,Image Watch 将回到你离开它的位置。

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

如果图像列表中显示了缩略图,单击图像将选中它并在右边的图像监视器中显示以进行详细地查看。监视器允许平移(拖动鼠标)和缩放(鼠标滚轮)。它还显示了当前鼠标位置的像素坐标和值。

在这里插入图片描述
注意在列表中的第二幅图像,edges,显示 “invalid”。这表示这个图像对象的某些数据成员的值已损坏或者为无效值(例如,图像宽度为负数)。在此程序中,这种现象是合理的,因为 edges 的 C++ 构造函数还没有运行,因此它的成员有未定义的值(在调试模式中,它们通常填充有 “0xCD” 字节)。

从此断点处开始,你可以但不调试代码并观察像素变化:如果在 “Mat edges” 上单步执行一次,则 edges 图像的状态将从 “invalid” 更改为 “empty”,这意味着它现在处于有效状态(默认构造),即使它尚未被初始化(例如,使用 cv::Mat::create())。如果在 cv::Canny() 调用上再执行一步,你将在图像列表中看到 edges 图像的缩略图。

现在假设你想对 cv::Canny() 实现过程进行一次可视化健全性检查。通过在图像列表中选择 edges 图像,将其带到监视器中,并缩放到具有清晰定义边缘的区域。

在这里插入图片描述
在图像查看器上右键打开菜单启用链接视图。

在这里插入图片描述

“链接视图” 的功能是可以在相同尺寸大小的图像之间翻转时保持视图区域的固定。若要查看它的工作原理,请从图像列表中选择 input 图像,你现在应该可以看到 input 图像相应的区域。

先放大 edges 图像,调整区域
在这里插入图片描述

查看 input 图像
在这里插入图片描述

可以看到相应的区域。

也可以使用上下方向键来回切换以查看 input 和 edges 图像,这样就可以很容易地验证检测到的边缘是否与输入图像中的数据很好地对齐。


更多 (More) …

Image Watch有很多更先进的功能,例如:

  1. 将图像固定到监视列表以便于跨作用域或在调试会话之间进行检查。
  2. 直接在监视器窗口内夹紧、阈值化或差异化图像。
  3. 将内存中的图像映像与文件中的引用映像进行比较。

有关详细信息,请参考在线 Image Watch 文档,亦可以在图像监视器窗口中点击 “Help” 链接访问文档页。

在这里插入图片描述

发布了73 篇原创文章 · 获赞 14 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/wangyuankl123/article/details/104847694
今日推荐