Opencv图像识别从零到精通(4)----cMake与源代码与image watch

来源:互联网 发布:布列根和妇女医院 知乎 编辑:程序博客网 时间:2024/05/21 09:07

           

        其实在学习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

 

图像识别算法交流 QQ群:145076161,欢迎图像识别与图像算法,共同学习与交流

4 0
原创粉丝点击