图像特征之SIFT

SIFT介绍

尺度不变特征转换即SIFT (Scale-invariant feature transform)是一种计算机视觉的算法。它用来侦测与描述影像中的局部性特征,它在空间尺度中寻找极值点,并提取出其位置、尺度、旋转不变量,此算法由 David Lowe在1999年所发表,2004年完善总结。其应用范围包含物体辨识、机器人地图感知与导航、影像缝合、3D模型建立、手势辨识、影像追踪和动作比对。局部影像特征的描述与侦测可以帮助辨识物体,SIFT特征是基于物体上的一些局部外观的兴趣点而与影像的大小和旋转无关。对于光线、噪声、些微视角改变的容忍度也相当高。基于这些特性,它们是高度显著而且相对容易撷取,在母数庞大的特征数据库中,很容易辨识物体而且鲜有误认。使用 SIFT特征描述对于部分物体遮蔽的侦测率也相当高,甚至只需要3个以上的SIFT物体特征就足以计算出位置与方位。在现今的电脑硬件速度下和小型的特征数据库条件下,辨识速度可接近即时运算。SIFT特征的信息量大,适合在海量数据库中快速准确匹配。

SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

算法过程可参考以下文章:

【精选】SIFT算法详解------图像特征提取与匹配_sift特征提取-CSDN博客

SIFT特征提取原理-CSDN博客

SIFT特征点提取「建议收藏」-腾讯云开发者社区-腾讯云 (tencent.com)

OpenCV实现的SIFT

OpenCV中有实现SIFT的类cv::SIFT。

参考文档:OpenCV: Introduction to SIFT (Scale-Invariant Feature Transform)

使用实例

复制代码
    Mat src1 = imread("1.1.jpg", 1);
    Mat src2 = imread("1.2.jpg", 1);
    imshow("src1", src1);
    imshow("src2", src2);

    if (!src1.data || !src2.data)
    {
        //_cprintf(" --(!) Error reading images \n");
        return;
    }

    //sift feature detect
    Ptr<SIFT> siftdetector = SIFT::create();
    vector<KeyPoint> kp1, kp2;

    siftdetector->detect(src1, kp1);
    siftdetector->detect(src2, kp2);
    Mat des1, des2;//descriptor
    siftdetector->compute(src1, kp1, des1);
    siftdetector->compute(src2, kp2, des2);
    Mat res1, res2;

    drawKeypoints(src1, kp1, res1);//在内存中画出特征点
    drawKeypoints(src2, kp2, res2);

    //_cprintf("size of description of Img1: %d\n",kp1.size());
    //_cprintf("size of description of Img2: %d\n",kp2.size());

    Mat transimg1, transimg2;
    transimg1 = res1.clone();
    transimg2 = res2.clone();

    char str1[20], str2[20];
    sprintf(str1, "%d", kp1.size());
    sprintf(str2, "%d", kp2.size());

    const char* str = str1;
    putText(transimg1, str1, Point(280, 230), 0, 1.0,Scalar(255, 0, 0),2);//在图片中输出字符

    str = str2;
    putText(transimg2, str2, Point(280, 230), 0, 1.0,Scalar(255, 0, 0),2);//在图片中输出字符

                                                                            //imshow("Description 1",res1);
    imshow("descriptor1", transimg1);
    imshow("descriptor2", transimg2);

    BFMatcher matcher(NORM_L2, true);
    vector<DMatch> matches;
    matcher.match(des1, des2, matches);
    Mat img_match;
    drawMatches(src1, kp1, src2, kp2, matches, img_match);//,Scalar::all(-1),Scalar::all(-1),vector<char>(),drawmode);
    //_cprintf("number of matched points: %d\n",matches.size());
    imshow("matches", img_match);

源码下载:

基于OpenCV和QT的图像处理验证程序源码资源-CSDN文库

相关推荐
牛客企业服务18 分钟前
2025年AI面试推荐榜单,数字化招聘转型优选
人工智能·python·算法·面试·职场和发展·金融·求职招聘
视觉语言导航1 小时前
RAL-2025 | 清华大学数字孪生驱动的机器人视觉导航!VR-Robo:面向视觉机器人导航与运动的现实-模拟-现实框架
人工智能·深度学习·机器人·具身智能
糖葫芦君1 小时前
Policy Gradient【强化学习的数学原理】
算法
羊小猪~~2 小时前
【NLP入门系列五】中文文本分类案例
人工智能·深度学习·考研·机器学习·自然语言处理·分类·数据挖掘
李师兄说大模型2 小时前
KDD 2025 | 地理定位中的群体智能:一个多智能体大型视觉语言模型协同框架
人工智能·深度学习·机器学习·语言模型·自然语言处理·大模型·deepseek
静心问道2 小时前
SqueezeBERT:计算机视觉能为自然语言处理在高效神经网络方面带来哪些启示?
人工智能·计算机视觉·自然语言处理
向阳@向远方3 小时前
第二章 简单程序设计
开发语言·c++·算法
锅挤3 小时前
深度学习5(深层神经网络 + 参数和超参数)
人工智能·深度学习·神经网络
网安INF3 小时前
深层神经网络:原理与传播机制详解
人工智能·深度学习·神经网络·机器学习
喜欢吃豆3 小时前
目前最火的agent方向-A2A快速实战构建(二): AutoGen模型集成指南:从OpenAI到本地部署的全场景LLM解决方案
后端·python·深度学习·flask·大模型