Image Watch(下载)是OpenCV的一款最新工具,它能够即时显示出矩阵的内容,即memory中Mat的信息,方便程序的调试,非常好用。不过目前该插件只支持VS2012,而且不能保存调试信息。
下载地址:点击打开链接
安装方法:
1 从以上网址下载插件,下载后得到一个ImageWatch.vsix。
2.打开VS2012安装目录,VS2012/COMMOM7/IDE/Microsoft VSIX Installer.EXE
3将文件复制一份,改名为vsixinstaller,放到上面那个目录下。
4双击最开始下载得到的ImageWatch.vsix
下面是opencv官方对image watch列出的帮助文档,花了好久才翻译完,供大家参考。
以下译文均来自Image watch 插件的官方帮助文档点击打开链接
需要Visual Studio 2012平台,为了确保混合调试模式的顺利进行,需要取消 Tools -> Options -> Debugging -> General -> Managed C++Compatibility Mode
基本操作:
第一次启动image watch插件:进入调试状态,选择View->OtherWindow->Image Watch.注意,执行一次此操作,在以后的调试过程中,Image Watch窗口会在调试时自动弹出,并在结束调试之后关闭。
Image Watch包含Locals和Watch window两个窗口,在右上角有单选按钮可以进行切换,与vs中的Locals 和Watch window的窗口相似。在Locals模式中,窗口将自动以图片的形式列出当前堆栈中的所有图片类型的变量;在Watch模式中,窗口将显示用户指定的图片类型变量。
列表中的每个图片给变量都以一个正方形的缩略图标进行标示。当小图标为蓝色时,将在右侧窗口显示该图片变量的详细附加信息,包括图像的缩略图、图片的尺寸(以像素为单位的宽和高)、像素格式(通道数以及像素的数据类型),具体支持的C++类型以及像素数据格式将在下文提到。
在右侧的图片浏览器中可以一次选定一张图片进行浏览,这个浏览窗口所支持的鼠标操作包括左键拖动以及滚轮滑动。当前图片的扩大倍数显示在又上角(F),当前像素坐标显示在鼠标指针处(G),当前像素值在窗口顶部显示,另外,通过旋转鼠标滚轮来放大图像,当放大倍数较高时,像素值将直接显示在原图上。
ImageWatch可以自动的加载当前调试过程中的图片变量,我们也可以通过在代码编辑窗口(J)或者监视器窗口(I)中右键点击变量选择将其添加到Image Watch窗口中进行浏览。
图像列表
图像列表(Figure1 B)的设计与VisualStudio中列表的框的设计相似,包含有Local和Watch两个模式。在Local模式中,这个列表中的元素是只读的,并且是自动显示的。在Watch模式中,可以通过双击文本词条,按F2键后直接输入变量名等方式来添加新的变量,词条可以剪切(Ctrl+X、Ctrl+Delete)、复制(Ctrl+C、Ctrl+Insert)和粘贴(Ctrl+V,Shift+Insert)等等。
可以通过Up和Down方向键、Tap/Ctrl+Tap以及Home/End键来操作图像列表
通过单击图像列表中每个词条左上角的“+/-”可以把相应的缩略图折叠或展开,条目折叠起来之后,将只显示条目的名称,这样做的好处是可以减少调试过程中image watch窗口的更新时间,因为窗口中显示的所有信息,包括各个缩略图标,都需要在执行完每个断点或者单步操作后重新加载。当图像列表中有相当多的项目,图片非常大或者调试过程是在远程计算机上执行的时候,每次插件更新时间久变得很明显,这种折叠图标的做法就显得非常有效。
如图2所示在image list窗口中有一个文本菜单(单击)鼠标右键激活。这个菜单里包含的项目有:
· Expand/Collapse All:展开或折叠当前列表中的所有条目
· Expand New Items:控制窗口条目默认显示状态是折叠还是展开
· Large Thumbnails:控制两种缩略图显示尺寸之间的切换
· Auto Maximize Contrast:如果没有选中,像素值在映射成颜色时将使用标准调色板规则;如果选中,当前像素值将会被映射成全彩色,注意,这一设置是适用于所有图像
• 1-Channel Pseudo Color:如果没有选中,单通道图像将会显示成灰度图像;如果选中之后,将会使用一个伪彩色调色板对图像进行着色,这一设置也是适用于所有图像的。
• 4-Channel Ignore Alpha:这一选项重要是针对四通道图像。如果选中,则四通道图像的最后一个通道将解释为alpha;如果未被选中,则随后一个通道的将会被忽略。
• Add to Watch:将选中的条目加入到watch窗口列表中。
• Add Address to Watch:将选中图像条目的地址加入到watch窗口列表中,当一个图像的存储跨越了不同的堆栈结构时,这一做法是非常有效的。
· Dump to File:把当前选中的图片存成一个文件,所支持的保存格式有PGN、JPG以及BIN格式(image watch的内部无损文件格式),BIN文件意味着只能用于image watch,可以使用@file operator来加载这些文件。
图像浏览窗口
图像浏览窗口(Figure1, E)对当前选中的条目进行更大尺寸的显示。在这个窗口中我们可以通过鼠标滚轮将图像迅速放大以便查看图像中单个像素的值(Figure 1, H)。
在图像浏览窗口中按住ctrl键同时按鼠标左键,能够快速实现在前后浏览的两个图片间进行切换。
窗口中像素的显示格式如下:x y | c0 c1 … cN.其中通道值是按照其在内存中出现的顺序来进行显示的。
单击右键将会弹出该窗口中的快捷菜单(Figure 3):
· Zoom to Fit:自动设置适合当前窗口显示的缩放比例
· Zoom to Original Size:将缩放比例设置为1.0,即图片中的一个像素对应着显示屏上的一个像素点。
· Link Views:如果被选中,所有的具有相同尺寸的图像在显示时都会在想对应的位置同比例显示。比如说,在放大观察了一幅1024*768的图像的某一区域后,在图像列表中选择了另外一张具有相同尺寸的图像,则浏览器将会显示第二章图像相同位置区域的放大效果;相反,如果选择了一张640*480的图片,将会看到一个不同的区域,也就是这张图片是按照所有640*480的图片规格进行显示的。
· Auto Maximize Contrast/1-Channel PseudoColor/4-Channel Use Alpha:这是图像列表中快捷菜单相应部分的镜像菜单,功能与之前的快捷菜单功能相同,在这里进行的这些选项的设置也是使用与所有图像的。
· Hexadecimal Display:这个选项将会触发visual studio中的“HexadecimalDisplay”设置,这个设置在初始化构建image watch窗口的过程中生效。在image watch中这个选项将决定像素值将以什么样的进制显示。
· Copy Pixel Address:将当前像素值在内存中的地址信息复制到剪贴板上,这一点对于做记录非常有帮助。可以讲得到的地址粘贴到VS中内存调试器中,或者用来生成一个数据断点。
图像格式
image watch支持下列C/C++图形格式
OpenCV:
· cv::Mat_<>
· cv::Mat
· CvMat
· _IplImage
用户自己定义的图像格式可以通过下面介绍的extensibility interface来进行添加。
像素格式
image watch中的像素格式主要包括通道类型和每个通道的格式
image watch主要支持以下数据类型
· INT8, UINT8
· INT16, UINT16
· INT32
· FLOAT16
· FLOAT32
· FLOAT64
通道格式表示通道数,最大为512通道。
需要指出的是,字符串的排列形式与像素的格式相关,每个通道是按照以下语义顺序进行排序的:
· RG, UV
· RGB, BGR, YUV
· RGBA, BGRA
如果没有明确指出通道语义的排列顺序(例如所有的opencv类型),image watch将使用缺省的调色板规则对图像进行分类。
同时image watch也至此一定数量的YUV格式。在这种情况下,通道语义的排列顺序将决定数据的排列方式,
· NV12 (两个方案:一个是Y平面,一个是打包后的UV平面,即在两个维度上进行二次抽样)
· YV12 (三个方案,一个是Y平面,一个是打包后的U平面和V平面,在两个维度上进行二次抽样)
· IYUV (与YV12方法相同但是U和V的平面顺序调换)
· YUY2 (单个方案,对两个通道进行各行扫描,Y是第一个通道,对U和V通道进行水平方向的二次抽样并以此存储在第二个通道中
更多关于YUV格式的信息请参照http://www.fourcc.org/yuv.php
颜色映射模式
image watch中使用下面两种规则对颜色进行映射:
首先取决于相应的颜色空间。如果相应的语义顺序缺省,则根据通道数来确定对应的颜色空间:
· 1 channel image:根据当前浏览器窗口中的设置来决定使用灰度图或者伪彩色图
· 2 channel image:红或者绿色
· 3 channel image: 蓝色绿色红色三原色
· 4 channel image: 蓝色绿色红色以及Alpha,或者忽略Alpha通道,与当前设置相关
· 5 or more channels: 先使用 B, G, R, 方案同时忽略其他通道
图像操作符
image watch中提供了很多简单操作符来更加形象的查看图像数据。为了与固有的C++语句相区分,这些操作符的名字都以“@”开头。
所有的操作符都是用来对图像进行评估。例如,@band操作符就是用来从图像中提取出一个单通道图像。它有两个参数,一个是图像名称,另一个是需要提取的通道的数字表示。
操作符之间可以进行嵌套。作为操作符输入的图像可以是任何形式的,即可以用其他一个操作符的输出作为另外操作符的输入。例如@thresh操作符可以对一幅图像进行二值化操作并返回一个二值图像,Figure 4 (L)显示了如何用120作为阈值去二值化一个图像中的Green通道中的值。
注意:在没有其他说明的情况下,imagewatch操作符的运行算法是的Float32位的,同时返回Float32的图像结果,这样就意味着INT32图像在经过运算后会丢失一些精度,FLOAT64图像在运算后不经会丢失精度,而且误差也会增大。
注意:在缺省情况下,FLOAT32将按照以下规则对图像的颜色进行映射:将0%强度的像素值映成0.0f,将100%强度的像素值映成1,0f,超出的部分将会被直接省略。例如如果@clamp 把一个UINT8 的图像限制到10和20之间,则结果图像将会被全部显示成白色,因为所有的像素值都处在10到20之间,将其直接映成1.0f。因此我们在使用image watch操作符时,需要确保选择了automatic contrast maximization。无独有偶,下面将要介绍的@norm8 和@norm16操作符来对结果进行除255和除65535的处理,也是一种数据类型的转化。
image watch操作符列表:
· @band(img, number): 根据number所指定的通道数提取图像中对应的数值,注意这个操作符要求指定需要提取的对应通道标示。
· @thresh(img, threshold): 对图像进行二值化处理,大于阈值时将像素赋值为1,小于阈值时将像素赋值为0。
· @clamp(img, min, max):用给定的最小值和最大值对图像的像素值进行截断。
· @abs(img): 计算图像中像素的绝对值
· @scale(img, factor): 将图像中的所有像素的像素值乘以比例系数factor
· @norm8(img): 将图像的像素值乘以1/255
· @norm16(img): 将图像的像素值乘以1/65535
· @fliph(img), @flipv(img), @flipd(img):将图像沿水平、垂直以及对角线方向进行对称翻转
· @rot90(img), @rot180(img), @rot270(img): 将图像沿顺时针方向旋转90度、180度和270度
· @diff(img0, img1): 逐点执行以下操作 img0 –img1
· @file(path): 从指定路径中加载图片.Example: @file(“d:\temp\debug.png”)
· @mem(address, type, channels, width, height, stride):根据给出的起始地址、通道类型、通道数、宽度、高度以及幅度来声明一段内存,例如Example: @mem(myimg.data, UINT8, 1, 320, 240, 320)
Figure1 点击打开链接
Figure4 点击打开链接
有感兴趣的欢迎大家加群51701853一起讨论。