• VLFeat(1)——SIFT图像特征提取(VC++实现)


    由于VLFeat说明文档中只提供了matlab的调用SIFT函数的实例,没有VC++的调用说明,本文是根据实验,在VS2010环境下,结合opencv开源库计算图像的SIFT的描述子,具体实现细节如下所示:

    1.配置VLFeat环境已经在之前的一篇博文VLFeat-----mean sift开源库 中介绍了详细的配置过程,可以参考;

    2.包含头文件:

    extern "C"{
    #include <vl/generic.h>
    #include <vl/stringop.h>
    #include <vl/pgm.h>
    #include <vl/sift.h>
    #include <vl/getopt_long.h>
    };

    3.实现过程如下:

        int _tmain(int argc, _TCHAR* argv[])
    {
        VL_PRINT ("Hello world!\n") ;
        char *ImagePath="D:\\拍摄测试图像\\1.jpg";
        IplImage *Image=cvLoadImage(ImagePath,0);
        //  int min=0;
        //  min=Image->width>Image->height?Image->height:Image->width;
        int noctaves=4,nlevels=2,o_min=0;
        // noctaves=(int)(log(min)/log(2));
        vl_sift_pix *ImageData=new vl_sift_pix[Image->height*Image->width];
        unsigned char *Pixel;
        for (int i=0;i<Image->height;i++)
        {
            for (int j=0;j<Image->width;j++)
            {
                Pixel=(unsigned char*)(Image->imageData+i*Image->width+j);
                ImageData[i*Image->width+j]=*(Pixel);
            }
        }
        VlSiftFilt *SiftFilt=NULL;
        SiftFilt=vl_sift_new(Image->width,Image->height,noctaves,nlevels,o_min);
        int KeyPoint=0;
        int idx=0;
        if (vl_sift_process_first_octave(SiftFilt,ImageData)!=VL_ERR_EOF)
        {
            while (TRUE)
            {
                //计算每组中的关键点
                vl_sift_detect(SiftFilt);
                //遍历并绘制每个点
                KeyPoint+=SiftFilt->nkeys;
                VlSiftKeypoint *pKeyPoint=SiftFilt->keys;
                for (int i=0;i<SiftFilt->nkeys;i++)
                {
                    VlSiftKeypoint TemptKeyPoint=*pKeyPoint;
                    pKeyPoint++;
                    cvDrawCircle(Image,cvPoint(TemptKeyPoint.x,TemptKeyPoint.y),TemptKeyPoint.sigma/2,CV_RGB(255,0,0));
                    idx++;
                    //计算并遍历每个点的方向
                    double angles[4];
                    int angleCount=vl_sift_calc_keypoint_orientations(SiftFilt,angles,&TemptKeyPoint);
                    for (int j=0;j<angleCount;j++)
                    {
                        double TemptAngle=angles[j];
                        printf("%d: %f\n",j,TemptAngle);
                        //计算每个方向的描述
                        float *Descriptors=new float[128];
                        vl_sift_calc_keypoint_descriptor(SiftFilt,Descriptors,&TemptKeyPoint,TemptAngle);
                        int k=0;
                        while (k<128)
                        {
                            printf("%d: %f",k,Descriptors[k]);
                            printf("; ");
                            k++;
                        }

                        printf("\n");
                        delete []Descriptors;
                        Descriptors=NULL;
                    }
                }
                //下一阶
                if (vl_sift_process_next_octave(SiftFilt)==VL_ERR_EOF)
                {
                    break;
                }
                //free(pKeyPoint);
                KeyPoint=NULL;
            }
        }
        vl_sift_delete(SiftFilt);
        delete []ImageData;
        ImageData=NULL;
        cvNamedWindow("Source Image",1);
        cvShowImage("Source Image",Image);
        cvWaitKey(0);
        cvReleaseImage(&Image);
        cvDestroyAllWindows();
        return 0;
    }
  • 相关阅读:
    如何说明白代码评审
    面试感悟----一名3年工作经验的程序员应该具备的技能(转载自@五月的仓颉)
    根据ip地址从第三方接口获取详细的地理位置
    linux安装telnet遇到的问题
    redis脑图
    数据库相关面试题
    logback系列一:名词解释
    java并发编程系列一、多线程
    logback系列二:logback在项目中的应用
    rocketmq特性(features)
  • 原文地址:https://www.cnblogs.com/yysblog/p/2254296.html
Copyright © 2020-2023  润新知