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

   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

相关文章:

  • 2022-02-08
  • 2021-07-25
  • 2022-12-23
  • 2022-01-06
  • 2022-01-18
  • 2021-06-23
  • 2022-02-07
  • 2021-10-21
猜你喜欢
  • 2021-11-09
  • 2021-07-30
  • 2021-07-01
  • 2021-06-21
  • 2022-12-23
  • 2021-10-08
  • 2021-08-27
相关资源
相似解决方案