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

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

  • 预备条件
  • 安装
  • 使用举例
  • 更多功能...

Image Watch是Microsoft Visual Studio的一个插件,它允许您在调试应用程序时可视化内存中的图像(例如cv::Mat或IplImage_对象)。这有助于跟踪bug,或者简单地理解给定的代码段在做什么。

预备条件

本教程假设您拥有以下可用资源:
1,Visual Studio 2012 Professional(或更高版本)安装了Update 1。
2,在您的Windows计算机上安装OpenCV
3,能够在Visual Studio中创建和构建OpenCV项目

安装

下载Image Watch安装程序。安装程序包含一个扩展名为.vsix (Visual Studio扩展名)的文件。要启动它,只需双击Windows Explorer中的.vsix文件。安装程序完成后,确保重新启动Visual Studio以完成安装。

使用举例

Image Watch与任何使用OpenCV图像对象(例如cv::Mat)的现有项目一起工作。在本例中,我们使用一个最小测试程序,它从文件加载图像并运行边缘检测器。要构建这个程序,在Visual Studio中创建一个控制台应用程序项目,将其命名为“image- wat-demo”,并插入下面的源代码。

   // VisualStudio图像监视调试器测试应用程序
   #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)设置为debug build (通常称为“调试”)。这将禁用编译器优化,以便在调试器中查看变量能够可靠地工作。
在build之前,不要忘记在项目中添加对于输入 image的命令行参数(右键单击项目- >属性- >配置属性- >调试,然后用 image的位置设置字段命令参数)。
现在,在如下源代码行上设置一个断点:

 Mat input;

在调试器中启动程序(Debug - >启动调试,或按F5)。当断点被击中时,程序暂停,Visual Studio在断点处显示一个黄色的指令指针:
使用Image Watch在Visual Studio调试器中查看内存中的图像_第1张图片
现在可以检查程序的状态。例如,您可以打开局部变量窗口(Debug - >窗口- >局部变量),它将显示当前范围内变量的名称和值:
使用Image Watch在Visual Studio调试器中查看内存中的图像_第2张图片
注意,内置的local窗口将只显示文本。这就是Image Watch插件该出来的地方。Image Watch就像另一个本地窗口,但内置了一个图像查看器。要打开Image Watch,选择View - >其他窗口- >Image Watch。像Visual Studio的local窗口一样,Image Watch可以停靠在Visual Studio IDE上。此外,Visual Studio还会记住是否打开了Image Watch,以及它在调试会话框之间的位置。以下是在我们的断点处停靠的图像观察窗口:
使用Image Watch在Visual Studio调试器中查看内存中的图像_第3张图片
左上方的单选按钮(local /Watch)选择下面图像列表中显示的内容:local列出当前范围内的所有OpenCV图像对象(这个列表是自动填充的)。图像列表显示基本信息,如宽度、高度、通道数量,还显示缩略图。在我们的示例中,图像列表包含两个本地图像变量:input, edges。
左键单击列表中的图像,以便在右侧的图像查看器中进行详细查看。查看器允许您平移(拖动鼠标)和缩放(鼠标滚轮)。它还显示当前鼠标位置的像素坐标和值。
使用Image Watch在Visual Studio调试器中查看内存中的图像_第4张图片
注意,列表中的第二个图像,即edges,显示为“invalid”。这表示该图像对象的一些数据成员具有损坏或无效的值(例如,负图像宽度)。这在程序的这一点上是预期的,因为针对edge的c++构造函数还没有运行,所以它的成员有未定义的值(在调试模式下,它们通常用“0xCD”字节填充)。
从这里,您可以单步通过您的代码(调试->步骤,或按F10),并观察像素的变化:边缘图像将从“invalid”变为“empty”,这意味着它现在处于有效状态(调用了默认构造),即使它还没有初始化(例如使用cv::Mat::create())。如果您对cv::Canny()调用多做一步操作,您会看到边缘图像的缩略图出现在图像列表中。
现在假设您希望对cv::Canny()实现进行可视化检查。通过在图像列表中选择edges图像,将edges图像带入查看器,并放大到边缘清晰的区域:
使用Image Watch在Visual Studio调试器中查看内存中的图像_第5张图片

右键单击图像查看器以打开视图上下文菜单并启用链接视图
使用Image Watch在Visual Studio调试器中查看内存中的图像_第6张图片
链接视图特性使视图区域在相同大小的图像之间切换时保持不变。要了解这是如何工作的,从图像列表中选择input图像—现在您应该看到输入图像中相应的放大区域:
使用Image Watch在Visual Studio调试器中查看内存中的图像_第7张图片
这样,您就可以很容易地验证所检测到的边是否与输入图像中的数据对齐。

更多功能…

Image watch有一些更高级的功能,如
1,将图像固定到监视列表中,以便跨范围或在调试会话之间进行检查
2,直接在Image watch里面对图像进行clamping, thresholding, or diff’ing
3,将内存中的图像与文件中的图像进行比较
详情请参阅网上 Image Watch Documentation ,你也可以通过点击Image watch窗口的帮助链接进入文件页面:
使用Image Watch在Visual Studio调试器中查看内存中的图像_第8张图片

你可能感兴趣的:(OPenCV,OPenCV,Image,Watch)