本教程假定您具有以下可用项:
下载 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()使用命名空间 std;使用命名空间 CV;无效帮助(){cout<< "----------------------------------------------------"<< endl<< “This is a test program for the Image Watch Debugger ” << endl<< “Visual Studio 的插件。程序加载一个“ << endl<< “图像,然后运行 Canny 边缘检测器。<< endl<< “不显示任何输出或将任何输出写入磁盘。”<< endl<< “用法:” << endl<< “image-watch-demo inputimage” << endl<< "----------------------------------------------------"<< endl<< endl;}int main(int argc, char *argv[]){help();如果 (argc != 2){cout << endl <<“参数数量错误”;返回 -1;}cout << “加载输入图像:” << argv[1] << endl;垫子输入;输入 = imread(argv[1], IMREAD_COLOR);cout << “检测输入图像中的边缘” << endl;垫子边缘;Canny(输入,边,10,100);返回 0;}
确保活动解决方案配置 (Build –> Configuration Manager) 设置为调试版本(通常称为“调试”)。这应该会禁用编译器优化,以便查看调试器中的变量可以可靠地工作。
生成解决方案(生成 –> 生成解决方案,或按?F7)。
在继续之前,不要忘记将输入图像的命令行参数添加到项目中(右键单击项目 - >属性 - >配置属性 - >调试,然后使用图像的位置设置字段命令参数)。
现在在源代码行上设置一个断点,指出
要设置断点,请右键单击源行,然后从上下文菜单中选择“断点 –>插入断点”。
在调试器中启动程序(“调试”>“开始调试”,或按?F5)。命中断点时,程序将暂停,Visual Studio 会在断点处显示一个黄色指令指针:
现在,您可以检查程序的状态。例如,可以打开“局部变量”窗口(“调试”>“窗口”>“局部变量”),该窗口将显示当前作用域中变量的名称和值:
请注意,内置的“局部变量”窗口将仅显示文本。这就是 Image Watch 插件的用武之地。Image Watch 类似于另一个?Locals?窗口,但内置了一个图像查看器。要调出 Image Watch,请选择 View –> Other Windows –> Image Watch。与 Visual Studio 的“局部变量”窗口一样,图像监视可以停靠到 Visual Studio IDE。此外,Visual Studio 还会记住你是否打开了图像监视,以及它在调试会话之间的位置。这意味着您只需执行此操作一次 - 下次开始调试时,Image Watch 将返回到您离开的地方。下面是停靠的“图像监视”窗口在断点处的样子:
左上角的单选按钮(Locals/Watch)选择下面的图像列表中显示的内容:?Locals?列出当前范围内的所有 OpenCV?图像对象(此列表会自动填充)。?Watch 显示已固定用于连续检查的图像表达式(此处未描述,有关详细信息,请参阅?Image Watch 文档)。图像列表显示基本信息,例如宽度、高度、通道数以及缩略图(如果有)。在我们的示例中,图像列表包含两个局部图像变量,input?和?edges。
如果图像有缩略图,左键单击该图像将选择该图像,以便在右侧的图像查看器中进行详细查看。查看器允许您平移(拖动鼠标)和缩放(鼠标滚轮)。它还显示当前鼠标位置的像素坐标和值。
请注意,列表中的第二个图像?edges?显示为“无效”。这表示此图像对象的某些数据成员具有损坏或无效的值(例如,负图像宽度)。这在程序的这一点上是预期的,因为边缘的C++构造函数尚未运行,因此其成员具有未定义的值(在调试模式下,它们通常填充“0xCD”字节)。
从这里,您可以单步执行代码(Debug->Step Over,或按?F10)并观察像素的变化:如果单步执行一次,越过 Mat edges; 语句,则 edges?图像将从 “invalid” 更改为 “empty”,这意味着它现在处于有效状态(默认构造),即使它尚未初始化(使用?cv::Mat::create()),例如)。如果在?cv::Canny()?调用上再执行一步,您将看到边缘图像的缩略图出现在图像列表中。
现在假设您要对?cv::Canny()?实现进行视觉健全性检查。通过在“图像列表”中选择边缘图像,将该图像带入查看器,然后放大到具有明确定义边缘的区域:
右键单击“图像查看器”以显示视图上下文菜单并启用“链接视图”(菜单项旁边的复选框指示是否启用该选项)。
“链接视图”功能可在相同大小的图像之间翻转时保持视图区域固定。要了解其工作原理,请从图像列表中选择输入图像 - 您现在应该在输入图像中看到相应的放大区域:
您还可以使用向上/向下光标键在查看输入和边沿之间来回切换。这样,您可以轻松验证检测到的边缘是否与输入图像中的数据很好地对齐。
图像手表具有许多更高级的功能,例如
有关详细信息,请参阅在线图像监视文档?- 您也可以通过单击图像监视窗口中的“帮助”链接来访问文档页面: