OpenCV介绍:Windows——图像观察:在 Visual Studio 调试器中查看内存图像 OpenCV v4.8.0

上一个教程如何在 "Microsoft Visual Studio "中使用 OpenCV 构建应用程序

下一个教程Java 开发入门

原作者Wolf Kienzle
兼容性OpenCV >= 3.0

警告
本教程可能包含过时信息。

Image Watch 是 Microsoft Visual Studio 的一个插件,可让您在调试程序时可视化内存中的图像(例如 cv::Mat 或 IplImage_ 对象)。这对于跟踪错误或简单了解特定代码正在做什么很有帮助。

前提条件

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

  1. 安装了 Update 1 的 Visual Studio 2012 Professional(或更高版本)。Update 1 可在此处下载。
  2. 在 Windows 机器上安装 OpenCV(教程:在 Windows 中安装)。
  3. 能够在 Visual Studio 中创建和构建 OpenCV 项目(教程:如何使用 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
        << "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);
    return 0;
}

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

构建解决方案(Build -> Build Solution,或按 F7)。

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

现在在源代码行设置一个断点,内容如下

Mat edges;

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

在调试器中启动程序(调试 -> 开始调试,或点击 F5)。当遇到断点时,程序会暂停,Visual Studio 会在断点处显示黄色指令指针:
在这里插入图片描述
现在,你可以检查程序的状态了。例如,您可以调出本地窗口(调试 -> 窗口 -> 本地),它将显示当前作用域中变量的名称和值:

在这里插入图片描述
请注意,内置的 Locals 窗口只能显示文本。这就是 Image Watch 插件的用武之地。Image Watch 就像另一个 Locals 窗口,但内置了图像查看器。要打开 Image Watch,请选择 “查看”->“其他窗口”->“Image Watch”。与 Visual Studio 的 Locals 窗口一样,Image Watch 也可以停靠在 Visual Studio IDE 上。此外,Visual Studio 还会记住你是否打开了 Image Watch,以及它在调试会话之间的位置。这意味着你只需做一次–下次开始调试时,Image Watch 就会回到你离开时的位置。下面是停靠在断点处的 Image Watch 窗口:
在这里插入图片描述
左上角的单选按钮(Locals/Watch)可选择下面图像列表中的显示内容: Locals 列出当前范围内的所有 OpenCV 图像对象(该列表会自动填充)。Watch 显示已固定用于持续检查的图像表达式(此处未作说明,详情请参见图像观察文档)。图像列表显示宽度、高度、通道数等基本信息,如果有的话,还会显示缩略图。在我们的示例中,图像列表包含两个本地图像变量:输入和边缘。

如果图像有缩略图,左键单击该图像将选择该图像,以便在右侧的图像查看器中进行详细查看。查看器允许你平移(拖动鼠标)和缩放(鼠标滚轮)。它还会显示当前鼠标位置的像素坐标和数值。
在这里插入图片描述
请注意,列表中的第二个图像(边缘)显示为 “无效”。这表明该图像对象的某些数据成员的值已损坏或无效(例如,图像宽度为负值)。在程序的这个阶段出现这种情况是意料之中的,因为边缘的 C++ 构造函数尚未运行,所以其成员值是未定义的(在调试模式下,它们通常被填充为 "0xCD "字节)。

从这里开始,您可以单步查看您的代码(Debug->Step Over,或按 F10)并观察像素的变化:如果您在 Mat edges; 语句上查看一次,edges 图像将从 “invalid”(无效)变为 “empty”(空),这意味着它现在处于有效状态(默认已构造),尽管它还没有被初始化(例如使用 cv::Mat::create())。如果在调用 cv::Canny() 的基础上再做一步,就会看到边缘图像的缩略图出现在图像列表中。

现在,假设你想对 cv::Canny() 的实现进行可视化检查。在图像列表中选择边缘图像,将其带入查看器,然后放大到有清晰边缘的区域:

在这里插入图片描述
右键单击 "图像查看器 "调出视图上下文菜单并启用 “链接视图”(菜单项旁边的复选框表示该选项是否已启用)。

在这里插入图片描述
当在相同大小的图像之间翻转时,链接视图功能可保持视图区域固定不变。要了解其工作原理,请从图像列表中选择输入图像–现在你应该可以看到输入图像中相应的放大区域:

在这里插入图片描述
您还可以使用上下光标键在查看输入和边缘之间来回切换。这样您就可以轻松验证检测到的边缘是否与输入图像中的数据完全一致。

更多

图像观察有许多更高级的功能,例如

  1. 将图像固定到观察列表中,以便在不同范围或不同调试会话之间进行检查
  2. 直接在观察窗口内对图像进行箝位、阈值化或差异化处理
  3. 将内存中的图像与文件中的参考图像进行比较

有关详情,请参阅在线 Image Watch 文档–您也可以通过点击 Image Watch 窗口中的帮助链接进入文档页面:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值