1、干啥用的
这个Image Watch(图像查看器)是一个与VS相结合的插件,专门用来查看Mat类的数据内部结构的,而不必要使用cout对图像数据的矩阵进行打印出来。
2、Image Watch的安装
在百度中输入image watch 我们呢选择Visual studio Markeplace 点击进入后可以进入到下载界面。
这个插件是vs官方提供的,下载后进行安装,最好此时关掉VS。
也许你下载了一个...但是安装不上,原因是Image Watch是与vs版本有对应关系的(例如我使用的是vs2017)。在Visual Studio的Marketplace中可以找到对应的ImageWatch版本。
3、Image Watch的使用
在vs中的“视图” -》 “其它窗口" 找到安装好的Image Watch,你给我狠狠的把它点出来。
注意:你如果想查看一个图像的Mat数据的内部结构,在使用ImageWatch之前你得让你的调试过程停在哪,也就是你得设置断点,然后再查看执行结果。否则的话,ImageWatch啥也看不着。
4、实战代码,教你偷窥图像的内部世界: (看到最后)
注意:你设置断点所在的行是不执行的,只执行到断点之前的那一行。另外断点变成黄色箭头就会表示马上执行这个黄色的箭头这行的代码(当前还未执行)。所以你查看图像数据时你得保证,执行了。
我在第一句代码执行之前就设置了执行断点,但是此时我依然能够使用image wathc去查看变量的内容(只不过查看的是空的Mat),因为在编译之前已经进行过了预编译。
#include<iostream>
#include<opencv2/opencv.hpp>//使用这个大的头文件可以将所有的opencv的头文件全都包含进去
using namespace std;
using namespace cv;
int main()
{
//创建一个Mat类,并读取图片数据
Mat b_img;//在此处设置一个端点,用于理解代码运行逻辑。
Mat a = (cv::Mat_<int>(3, 3) << 1,2,3,4,5,6,7,8,9);//利用枚举法创建一个单通道的Mat
b_img = imread("C:\\Users\\神匠\\Desktop\\lena.jpeg", IMREAD_COLOR);//以彩色方式读取
Mat gray = imread("C:\\Users\\17266\\Desktop\\lena.png", IMREAD_GRAYSCALE);//以灰度方式
读取
return 0;
}
思路起飞:
我们将查看的图像矩阵的尺寸使用滚轮放大后,我们将鼠标放置在Mat的某个元素上,在ImageWatch的左上角会出现两组数字,第一组是这个元素的列+行的信息,是以0为基数的。第二组数据是当前元素的信息:如果是灰度图单通道的,显示的是灰度值。如果是3通道的,显示的是BGR值。矩阵图像可以放大和缩小也可以水平拖动。在watch窗口的右上角也有一组数据,是像素在当前视窗下的放大或缩小倍数,原图的大小就是1.00x.
当我们的图像以显示矩阵的形式被无限放大后其实也可以看到上边的这些像素点上有信息,比如3通道的上边显示的就是当前像素的RGB值(宏观视角转换成微观视角了)。
当滑动滚轮,Mat矩阵被缩小后,我们看到了图片全景但是看不到这些通道下的信息值了(微观视角转换为宏观视角了)。
小结:所有的元素(像素)它只有唯一的一个颜色,纵然这个颜色是一个BGR值。它也是一个单一的像素的值。
- 当运行到第一行的断点时,显示的三个mat变量中的属性都是invalid,但是运行完第一句后,b_img的属性就发生变化了,它不再是无效的而是noinit 表示未进行初始化。
- 使用逐过程,执行下一句(非逐语句),我们发现当a被赋值后它的行列信息中显示的是3X3,而它的数据信息中显示1xINT32 这表示是1通道的,是整形int类型数据的。当我们在Image Watch的信息栏点击这个a的时候右边就出现了像素矩阵是一个3x3的,但是里边这9个像素都是白的,将右边的矩阵使用滚轮儿放大后我们发现矩阵中是有数字的分别每个格子是1到9的数值。
- 继续逐过程执行,当b_image被初始化后,它显示了lena的Mat矩阵信息为 532x528 其数据信息显示为3xUINT8表示3通道的无符号整形。
- 继续逐过程执行,当gray这个mat变量被赋值时我们发现矩阵的行列信息与b_image是一样的,但是它是1xUINT8也就是说它灰度显示的时候是单通道的mat。
- 当我们的程序调试完毕后,vs会对资源进行清除,此时Image Watch中就不再有显示了