zoukankan      html  css  js  c++  java
  • SIFT+HOG+鲁棒统计+RANSAC

      今天的计算机视觉课老师讲了不少内容,不过都是大概讲了下,我先记录下,细讲等以后再补充。

       SIFT特征:

                   尺度不变性:用不同参数的高斯函数作用于图像(相当于对图像进行模糊,得到不同尺度的图像),用得到的图像作差,找极值(相

            当于穷举不同尺度空间的图像,找其特征点,在不同尺度下,都在极值范围之内,故能满足尺度不变性。

                  然后要找到极值点的位置,对其进行定位。

                  然后对极值进行描述。

                  旋转不变性:用梯度方向来表示极值点的方向,定义主方向能保证旋转不变性。

                  光照不变性

          SIFT的特征点检测是在DOG图像上进行的,关于DOG可参考:http://blog.csdn.net/abcjennifer/article/details/7639488,解释得很清楚。

          这篇博文http://www.zhizhihu.com/html/y2010/2146.html主要说了尺度空间和图像金字塔间的差别:尺度空间实际上就是平滑,像素不变;金字塔则是对图像进行降采样,像素降低。

          

    int main(int argc, char* argv[])
    {
        Mat img_1 = imread("basketball.jpg", CV_LOAD_IMAGE_GRAYSCALE);//宏定义时CV_LOAD_IMAGE_GRAYSCALE=0,也就是读取灰度图像
        Mat img_2 = imread("basketball2.jpg", CV_LOAD_IMAGE_GRAYSCALE);//一定要记得这里路径的斜线方向,这与Matlab里面是相反的
        if (!img_1.data || !img_2.data)//如果数据为空
        {
            cout << "opencv error" << endl;
            return -1;
        }
        cout << "open right" << endl;
        
        //第一步,用SIFT算子检测关键点
    
        SiftFeatureDetector detector;//构造函数采用内部默认的
        std::vector<KeyPoint> keypoints_1, keypoints_2;//构造2个专门由点组成的点向量用来存储特征点
    
        detector.detect(img_1, keypoints_1);//将img_1图像中检测到的特征点存储起来放在keypoints_1中
        detector.detect(img_2, keypoints_2);//同理
    
        //在图像中画出特征点
        Mat img_keypoints_1, img_keypoints_2;
    
        drawKeypoints(img_1, keypoints_1, img_keypoints_1, Scalar::all(-1), DrawMatchesFlags::DEFAULT);//在内存中画出特征点
        drawKeypoints(img_2, keypoints_2, img_keypoints_2, Scalar::all(-1), DrawMatchesFlags::DEFAULT);
    
        imshow("sift_keypoints_1", img_keypoints_1);//显示特征点
        imshow("sift_keypoints_2", img_keypoints_2);
        
        //计算特征向量
        SiftDescriptorExtractor extractor;//定义描述子对象
    
        Mat descriptors_1, descriptors_2;//存放特征向量的矩阵
    
        extractor.compute(img_1, keypoints_1, descriptors_1);//计算特征向量
        extractor.compute(img_2, keypoints_2, descriptors_2);
    
        //用burte force进行匹配特征向量
        BruteForceMatcher<L2<float>>matcher;//定义一个burte force matcher对象
        vector<DMatch>matches;
        matcher.match(descriptors_1, descriptors_2, matches);
    
        //绘制匹配线段
        Mat img_matches;
        drawMatches(img_1, keypoints_1, img_2, keypoints_2, matches, img_matches);//将匹配出来的结果放入内存img_matches中
    
        //显示匹配线段
        imshow("sift_Matches", img_matches);//显示的标题为Matches
    
        waitKey(0);
        return 0;
    }
    SIFT Code

    具体可参考:http://www.cnblogs.com/tornadomeet/archive/2012/08/16/2643168.html

       HOG:梯度直方图。SIFT特征的前三步。

    HOG与SIFT:

    HOG可先参考这位博主:http://blog.csdn.net/abcjennifer/article/details/7365651,通俗的介绍了HOG:

    通俗的讲:

    HOG特征提取方法就是将一个image:

    1.            灰度化(将图像看做一个x,y,z(灰度)的三维图像)

    2.            划分成小cells(2*2)

    3.            计算每个cell中每个pixel的gradient(即orientation)

    4.            统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的descriptor

    这篇博文以图解的形式介绍了opencv源码中的一些参数:http://blog.csdn.net/raodotcong/article/details/6239431

       HOG与SIFT的区别

        HOG和SIFT都是描述子,以及由于在具体操作上有很多相似的步骤,所以致使很多人误认为HOG是SIFT的一种,其实两者在使用目的和具体处理细节上是有很大的区别的。HOG与SIFT的主要区别如下:
    (1)SIFT是基于关键点特征向量的描述。
    (2)HOG是将图像均匀的分成相邻的小块,然后在所有的小块内统计梯度直方图。
    (3)SIFT需要对图像尺度空间下对像素求极值点,而HOG中不需要。
    (4)SIFT一般有两大步骤,第一个步骤对图像提取特征点,而HOG不会对图像提取特征点。
     HOG的优缺点
    优点:
    (1)HOG表示的是边缘(梯度)的结构特征,因此可以描述局部的形状信息;
    (2)位置和方向空间的量化一定程度上可以抑制平移和旋转带来的影响;
    (3)采取在局部区域归一化直方图,可以部分抵消光照变化带来的影响;
    (4)由于一定程度忽略了光照颜色对图像造成的影响,使得图像所需要的表征数据的维度降低了;
    (5)而且由于这种分块分单元的处理方法,也使得图像局部像素点之间的关系可以很好得到表征。
    缺点:
    (1)描述子生成过程冗长,导致速度慢,实时性差;
    (2)很难处理遮挡问题;
    (3)由于梯度的性质,该描述子对噪点相当敏感。
    具体可参考:http://www.cnblogs.com/zhazhiqiang/p/3595266.html
     

      鲁棒统计

       Hough变换:举例说明吧。怎么用一系列点来确定一条直线。

                         每两个点确定k,b(斜率和截距),然后统计k,b的数量。相当于用每两个点进行投票,谁的票多,最后就能确定k,b

                         这个解释通俗易懂 http://www.cnblogs.com/smartvessel/archive/2011/10/20/2218654.html

      RANSAC:

                       说下大致算法吧,同样举例说明。

                        随机选两个点作出模型,计算内点到此模型的距离之和。

                        重复上述过程,选出距离最小的那个模型。

                        参考:http://www.cnblogs.com/xrwang/archive/2011/03/09/ransac-1.html

  • 相关阅读:
    CodeForces 7B
    CodeForces 4D
    离散化
    线段树入门
    洛谷 P3951 小凯的疑惑(赛瓦维斯特定理)
    Codeforces 1295D Same GCDs (欧拉函数)
    Codeforces 1295C Obtain The String (二分)
    Codeforces 1295B Infinite Prefixes
    Codeforces 1295A Display The Number(思维)
    Codeforces 1294F Three Paths on a Tree(树的直径,思维)
  • 原文地址:https://www.cnblogs.com/573177885qq/p/4486949.html
Copyright © 2011-2022 走看看