其实在学习opencv图像的时候,不是那么需要看源代码。但是还是有想学习一下的人,所以就写出来如何去看源代码,其实名字应该是代码追踪,就是我们在设置断点调试的时候,可以看到内部的定义,一堆一堆,在后面会送上imshow()与imread()的源代码可以用来欣赏学习。
自己看了好多教程,重载了一次软件还,终于能够F11到自己想要的源代码了
vs2010, cmake2.8, opencv2.4.9,这是需要的东西,估计大家都有,没有或者下不到的可以私信或者留言索要,这里就不多说了。
第一步要生产源代码
(1) 运行解压的camke文件,在bin文件夹下运行cmake-gui.exe
( 2) 在where is the source code:选择路径为D:\Program Files\opencv\sources(就是你解压opencv的路径,一般教 程都是这个位置)
下面的路径,就自己选择了,《随意》 ,我的是F:\opencv
(3)先点一次configure,然后选择编译器,我的是vs2010,所以选visual studio 10(如果不是自己根据实际选 择),等出现configuring done 然后再点一次configure 再等出现configuring done,然后点击generate,出现 configuring done.
这个完成就可以看到很多的源代码了,文章就是 《 随意》那里的路径,我的就在F:\opencv,然后打开这个文件夹,找到opencv.sln打开看到下图
左边那些点开,找到src文件夹,里面就是源文件,那么如何对应呢?例如上一篇的imread(),他的源代码在higngui模块下的,loadsave.cpp,估计要是从这么多的模块和代码下面找,需要很大的功夫,那么怎么实现快速的方法吗?这个也是折磨死我了,方式就是需要再配置一点东西。
(1)首先要设置一个启动项,为什么呢?其实目的不是太大,主要是因为如果你不设置的话,默认的是ALL_BUILD作为启动项,要选中install这个,因为后面后用这个文件夹,然后你就弹出错误提示了,可以尝试,看到错误了,然后再设置一个启动,看上图右击,选择设为启动项目
(2)分别在Dudug 和Release模式下进行调试,这个时间挺长的,耐心等待,知道出现 xxxx个成功,0个失败,0个最新,2个模式下都是这样的
(3)设置环境变量,F:\opencv\bin\Debug 和 F:\opencv\bin\Release,这里因为我压缩到F:\opencv所以参考着写,添加环境变量的方法和第一节中方法一样,可以回顾看一下
(4)下面也是差不多,就是要添加包含目录和库目录
VC++ 目录 -> 包含目录, VC++ 目录 -> 库目录进行设置:
F:\opencv\install\include
F;\opencv\install\include\opencv
F:opencv\install\include\opencv2
VC++ 目录 ->库目录:F:opencv\lib\Debug
(5)链接器->输入->附加依赖项处添加:一堆的东西,这个和第一节中加的东西是一样的很长,这些省略,可以去第一节那里复制进行粘贴
下面设置断点就可以看到imread(),其实imread()没有什么主要是imread_()
先看一下imread()
然后是Imread_()
就是这样一层一层的拨开你的心,哈哈
上图和源代码
static void*imread_( const string& filename, int flags, int hdrtype, Mat* mat=0 )
{
IplImage* image = 0;
CvMat *matrix = 0;
Mat temp, *data = &temp;
ImageDecoder decoder = findDecoder(filename);
if( decoder.empty() )
return 0;
decoder->setSource(filename);
if( !decoder->readHeader() )
return 0;
CvSize size;
size.width = decoder->width();
size.height = decoder->height();
int type = decoder->type();
if( flags != -1 )
{
if( (flags & CV_LOAD_IMAGE_ANYDEPTH) == 0 )
type = CV_MAKETYPE(CV_8U, CV_MAT_CN(type));
if( (flags & CV_LOAD_IMAGE_COLOR) != 0 ||
((flags & CV_LOAD_IMAGE_ANYCOLOR) != 0 && CV_MAT_CN(type) > 1) )
type = CV_MAKETYPE(CV_MAT_DEPTH(type), 3);
else
type = CV_MAKETYPE(CV_MAT_DEPTH(type), 1);
}
if( hdrtype == LOAD_CVMAT || hdrtype == LOAD_MAT )
{
if( hdrtype == LOAD_CVMAT )
{
matrix = cvCreateMat( size.height, size.width, type );
temp = cvarrToMat(matrix);
}
else
{
mat->create( size.height, size.width, type );
data = mat;
}
}
else
{
image = cvCreateImage( size, cvIplDepth(type), CV_MAT_CN(type) );
temp = cvarrToMat(image);
}
if( !decoder->readData( *data ))
{
cvReleaseImage( &image );
cvReleaseMat( &matrix );
if( mat )
mat->release();
return 0;
}
return hdrtype == LOAD_CVMAT ? (void*)matrix :
hdrtype == LOAD_IMAGE ? (void*)image : (void*)mat;
}
Mat imread( const string& filename, int flags )
{
Mat img;
imread_( filename, flags, LOAD_MAT, &img );
return img;
}
想学习源代码的,以后就可以方便的看了,深刻理解更为重要。
最后看一个又一个实用的工具,Image watch,是让你感觉到matlab的形象感觉,下面图片一看就明白
Image Watch可进行的操作包括:
1. 放大、缩小图像;
2. 将图像保存到指定的目录;
3. 显示图像大小、通道数;
4. 拖拽图像;
5. 可以查看指定坐标的像素值(按照在内存中的顺序显示);
6. Link Views:所有相同尺寸的图像共享一个视图;
7. 像素值以十六进制显示还是十进制显示;
8. 在Watch窗口可对图像进行的操作包括(Image Watch包括Locals和Watch两个窗口):
(1)、提取指定通道图像:@band(img, number);
(2)、对指定图像进行阈值化:@thresh(img, threshold);
(3)、对图像像素值进行取绝对值操作:@abs(img);
(4)、对图像像素值进行缩放操作:@scale(img, factor);
(5)、通过1/255方式缩放像素值操作:@norm8(img);
(6)、沿y轴水平flip:@fliph(img);
(7)、沿x轴垂直flip:@flipv(img);
(8)、对图像进行矩阵转置操作:@flipd(img);
(9)、对图像进行顺时针90、180、270度操作:@rot90(img)、@rot180(img)、@rot270(img);
(10)、计算两幅图像的像素差值:@diff(img0, img1);
(11)、载入图像:@file(path),如 @file(“d:\1.jpg”);
(12)、将指定的内存地址内容按照指定的图像格式显示出来:@mem(address, type, channels, width, height, stride),如@mem(0x00000000003d1050,UINT8, 3, 256, 256, 768 );
Image Watch的更详细介绍可参考:http://research.microsoft.com/en-us/um/redmond/groups/ivm/imagewatchhelp/imagewatchhelp.htm