文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

Image Watcch是Microsoft Visual Studio的一款用于内存中保存图像(例如cv::Mat 或Ipllimage_objects)可视化的一款插件,可用于程序调试过程中。这对跟踪bug和理解代码功能很有帮助。

前提条件

需要满足以下条件:

  1. 安装了Visual Studio 2012 Professional Update 1(或更高版)。 Update1可以在 这里 下载.
  2. windows操作系统的电脑上安装了OpenCV(教程: Installation in Windows)。
  3. 在Visual Studio下创建OpenCV项目的能力(教程: How to build applications with OpenCV inside the Microsoft Visual Studio)。
第 1 段(可获 2 积分)

安装

下载 Image Watch 安装程序. 安装程序是一个后缀为.vsix (Visual Studio Extension)的文件. 双击VSIX文件就可以开始安装啦。安装程序运行完成后,请重启Visual Studio 完成安装。

示例

Image Watch 在任何使用OpenCV图像对象(例如:cv::Mat)的工程中均可使用。示例中,我们使用最简单的测试程序:从文件中加载图像,并进行边缘检测。在Visual Studio中创建控制台应用程序,命名为“image-watch-demo”,插入下面的源代码。

第 2 段(可获 2 积分)
// Test application for the Visual Studio Image Watch Debugger extension

#include <iostream>                        // std::cout
#include <opencv2/core/core.hpp>           // cv::Mat
#include <opencv2/highgui/highgui.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], CV_LOAD_IMAGE_COLOR);

    cout << "Detecting edges in input image" << endl;
    Mat edges;
    Canny(input, edges, 10, 100);

    return 0;
}
第 3 段(可获 2 积分)

确认你的解决方案是在debug下运行,解决方案配置路径为:Build ‣ Configuration Manager。 禁止编译器优化以便调试过程中变量的可靠性。

建立解决方案 (Build ‣ Build Solution, 或按 F7).

不要忘记在项目中加入输入图像的命令行参数(右键单击project ‣ Properties ‣ Configuration Properties ‣ Debugging 之后在Command Arguments 中输入图像位置)。

现在在如下代码处设置断点:

第 4 段(可获 2 积分)
Mat edges;

右键单击源码行,选择 Breakpoints ‣ Insert Breakpoint 设置断点。

调试程序 (Debug ‣ Start Debugging, 或按下 F5). 当命中断点时,程序暂停,Visual Studio 会在断点处显示黄色的指示箭头。

现在你可以检查程序的状态。例如,你可以打开Local 窗口 (Debug ‣ Windows ‣ Locals), 会显示当前作用域中变量的名字和值:

注意内置的Local 窗口只能显示文本。Image Watch插件将会放在这里。Image Watch就像是另一个Local窗口,但它有内置的图像浏览器。 选择View ‣ Other Windows ‣ Image Watch 打开Image Watch. 和 Visual Studio’s Locals 窗口一样, Image Watch 能够停靠在Visual Studio IDE边界. 此外, Visual Studio 也能保存Image Watch的相关配置:打开与否,停靠位置等。这意味着我们只需要配置一次,下次进行调试的时候Image Watch会自动停靠到之前设置位置。这是在触发断点下Image Watch停靠窗口的示意图:

第 5 段(可获 2 积分)

../../../../_images/toolwindow.jpg

左上角的单选按钮(Locals/Watch)可以选择 Image List 中显示的选项 : Locals 列出当前OpenCV所有图像对象(这个列表能自动填充)。 Watch 显示已被固定的连续检查的图像表达式(这里不做描述, 详情请参考 Image Watch documentation )。图像列表显示基本信息,如宽度, 高度、通道数甚至 缩略图(可用时)。在我们的例子中, 图像列表包括两个图像局部变量, inputedges.

如果一个图像有一个缩略图,左键点击该图像,可以在右侧的 Image Viewer 中显示。 查看器中图像能够移动(拖拽鼠标)和缩放(滚动滑轮)图像。 它还能显示当前鼠标的位置的坐标和像素值。

第 6 段(可获 2 积分)

../../../../_images/viewer.jpg

请注意列表中的第二幅图像, edges显示为“无效”。这表明图像的一些数据成员有损坏或无效的值(例如, 负图像宽度)。程序在编写过程中注意到了这一点,由于 edges 的C++构造函数尚未运行,因此其成员有未定义值(在调试模式下,他们通常被填充为“0xcd”)。

这里你可以进行单步调试(Debug->Step Over,或按 F10)观察像素的变化:如果你运行 到 Mat edges; 处, edges 图像将从“无效”转变为“空”, 这意味着它现在是处于有效状态(默认构造结果), 即使它还没有被初始化(例如使用 cv::Mat::create())。··如果继续单步调试到 cv::Canny() ,你会看到边缘图像的缩略图出现在图像列表中。

第 7 段(可获 2 积分)

现在假设你想使用可视化图像验证 cv::Canny() 实现的正确性。 在Image List中选择 edges图像,在viewer中显示并放大部分区域以看到清晰的边界: 

../../../../_images/edges_zoom.png

右键点击 Image Viewer 并勾选Link Views (菜单选项旁边的复选框会指示该选项是否启用)。

../../../../_images/viewer_context_menu.png

Link Views 能够在切换同样大小图像的过程中,保持图像视图区域固定。为了观察它是如何工作的,在image list 里选择input图像,你可以看到input图像中相应的放大区域。

第 8 段(可获 2 积分)

../../../../_images/input_zoom.png

你也可以通过上/下光标键来切换查看输入图像和边缘图像。 这样,你可以很容易地验证检测到的边缘线是否与输入图像中的数据相符。

其他

Image watch有一些更先进的功能, 例如

  1. 在作用域或调试会话之间的检查列表中固定图像
  2. clamping,thresholding,或diff'ing图像直接在监视窗口中
  3. 比较内存中图像和文件参考图像的区别

请参阅网上 Image Watch Documentation 有关细节,你也可以通过点击文档页面上的 帮助 在图像监视窗口中的链接:

../../../../_images/help_button.jpg

第 9 段(可获 2 积分)

文章评论