codecamp

Image Watch:在Visual Studio调试器中查看内存中的图像

Image Watch是Microsoft Visual Studio的插件,可让您在调试应用程序时,可视化内存映像(例如,cv :: Mat或IplImage_对象)。这可能有助于跟踪错误,或者简单地了解给定的代码块在做什么。

先决条件

本教程假设您有以下可用:

  1. Visual Studio 2012 Professional(或更好)安装Update 1。
  2. Windows机器上的OpenCV安装(教程:在Windows中安装)。
  3. 能够在Visual Studio中创建和构建OpenCV项目(教程:如何使用OpenCV在“Microsoft Visual Studio”中构建应用程序)。

安装

下载 Image Watch安装程序。安装程序在一个扩展名为.vsix(Visual Studio Extension)的文件中。要启动它,只需在Windows资源管理器中双击.vsix文件即可。安装程序完成后,请确保重启Visual Studio以完成安装。

Image Watch与任何使用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()
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 - > Configuration Manager)设置为调试版本(通常称为“调试”)。这应该禁用编译器优化,以便在调试器中查看变量可以可靠地工作。

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

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

现在在源代码行设置一个断点

Mat edges;

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

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

Image Watch

现在你可以检查你的程序状态。例如,您可以打开本地窗口(Debug - > Windows - > Locals),该窗口将显示当前范围中变量的名称和值:

Image Watch

请注意,内置的“ 本地”窗口将仅显示文本。这是Image Watch插件所在的位置。Image Watch就像另一个Locals窗口,但内置了一个图像查看器。要启动Image Watch,请选择View - > Other Windows - > Image Watch。像Visual Studio的“ 本地”窗口一样,Image Watch可以停靠在Visual Studio IDE上。此外,Visual Studio会记住您是否打开了Image Watch,以及调试会话之间的位置。这意味着您只需要执行一次 - 下次开始调试时,Image Watch将返回到您离开的地方。这是停靠在图像监视窗口在我们的断点:

在Visual Studio调试器中查看内存中的图像

左上角的单选按钮(Locals / Watch)选择下面的图像列表中显示的内容:Locals列出了当前范围内的所有OpenCV图像对象(该列表自动填充)。手表显示已被固定为连续检查的图像表达式(此处未说明,有关详细信息,请参阅Image Watch文档)。图像列表显示基本信息,如宽度,高度,通道数,以及可用的缩略图。在我们的示例中,图像列表包含我们的两个局部图像变量,输入和边。

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

在Visual Studio调试器中查看内存中的图像

请注意,列表中的第二个图像边缘显示为“无效”。这表示该图像对象的某些数据成员具有损坏或无效的值(例如,负图像宽度)。由于C ++构造器的边缘尚未运行,因此其成员具有未定义的值(在调试模式下,通常使用“0xCD”字节填充)。

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

现在假设你想对cv :: Canny()实现进行视觉完整性检查。将边缘图像通过在图像列表中选择并放大到具有明确界限的区域:

在Visual Studio调试器中查看内存中的图像

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

在Visual Studio调试器中查看内存中的图像

当在相同大小的图像之间翻转时,链接视图功能会使视图区域固定。要了解如何工作,请从图像列表中选择输入图像,您现在应该看到输入图像中相应的放大区域:

在Visual Studio调试器中查看内存中的图像

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

更多 ...

图像手表具有许多更先进的功能,如

  1. 将图像固定到监视列表,以便在示波器之间或调试会话之间进行检查
  2. 在Watch窗口内直接夹紧,阈值或分割图像
  3. 将内存中的图像与来自文件的参考图像进行比较

有关详细信息,请参阅在线图像监视文档 - 您还可以通过单击“图像监视”窗口中的“ 帮助”链接访问文档页面:

help_button


如何使用OpenCV在“Microsoft Visual Studio”中构建应用程序
OpenCV Java开发教程
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

OpenCV教程

OpenCV高级GUI和媒体(highgui模块)

OpenCV图像输入和输出(imgcodecs模块)

对象检测(objdetect模块)

计算摄影(照片模块)

图像拼接(拼接模块)

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }