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

           

        其实在学习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
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值