opencv中的surf和sift

SURF算法之Opencv代码详解 这篇博客详细介绍了SURF特征点检测算法的OpenCV实现代码 阅读详情


作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 欢迎转载或分享,但请务必声明文章出处。

因为最近准备看特征点检查方面的源码,而其中最著名的算法就是sift和surf。因此这次主要是学会怎样使用opencv中的sift和surf函数来检测特征点和描述特征点,以及怎样使用其算法来进行特征点匹配。庆幸的是,sift算法虽然是专利,但是在opencv的努力下也获得了作者的允许,将其加入了新版本的opencv中了。

使用环境:opencv2.3.1+vs2010

功能:找出2幅图中特征点,并将其描述出来,且在2幅中进行匹配。2幅图内容相同,但是经过了曝光,旋转,缩放处理过。

首先来看sift算法函数的使用。

工程代码:

复制代码
// sift_test.cpp : 定义控制台应用程序的入口点。

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"//因为在属性中已经配置了opencv等目录,所以把其当成了本地目录一样
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;
using namespace std;

void readme();

int main(int argc,char* argv[])
{
    Mat img_1=imread("./image/query.png",CV_LOAD_IMAGE_GRAYSCALE);//宏定义时CV_LOAD_IMAGE_GRAYSCALE=0,也就是读取灰度图像
    Mat img_2=imread("./image/rs_query.png",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;
}
复制代码

 

运行结果如下:

 

 

 

 

下面看surf算法函数的使用(和sift基本一样,就是函数名改了下而已):

工程代码:

复制代码
// surf_test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include "opencv2/core/core.hpp"//因为在属性中已经配置了opencv等目录,所以把其当成了本地目录一样
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;
using namespace std;

void readme();

int main(int argc,char* argv[])
{
    Mat img_1=imread("./image/query.png",CV_LOAD_IMAGE_GRAYSCALE);//宏定义时CV_LOAD_IMAGE_GRAYSCALE=0,也就是读取灰度图像
    Mat img_2=imread("./image/rs_query.png",CV_LOAD_IMAGE_GRAYSCALE);//一定要记得这里路径的斜线方向,这与Matlab里面是相反的
    
    if(!img_1.data || !img_2.data)//如果数据为空
    {
        cout<<"opencv error"<<endl;
        return -1;
    }
    cout<<"open right"<<endl;

    //第一步,用SURF算子检测关键点
    int minHessian=400;

    SurfFeatureDetector detector(minHessian);
    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("surf_keypoints_1",img_keypoints_1);
    imshow("surf_keypoints_2",img_keypoints_2);

    //计算特征向量
    SurfDescriptorExtractor 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("surf_Matches",img_matches);//显示的标题为Matches
    waitKey(0);
    return 0;
}
复制代码

其运行结果如下:

      从这个实验可以知道,在opencv中使用这2个算法是多么的简单!只需要简单的几个参数就可以达到很好的效果。但这只是opencv的低级应用,我们应该在最好能用opencv一些内部函数来帮助实现自己的算法和想法。这就是分析opencv源码的主要目的。

     另外,从实验的过程中可以感觉出来surf算法的运行时间比sift快很多,且特征点的数目检测得比较多,其它的暂时还没区别出来。欢迎交流,谢谢!


Opencv下利用SIFT、SURF、ORB三种特征点实现图像匹配 Opencv下利用SIFT、SURF、ORB三种特征点实现图像匹配视频项目中要用到拼接,这里记录一下SIFT、SURF、ORB三种特征点。 本文不做过多的理论解释,只是利用opencv简单实现三种特征点匹配算法的验证(改进的部分暂未上传)。代码下载地址:Opencv下利用SIFT、SURF、ORB三种特征点实现图像匹配 环境: Windows下vs2010,opev2.4.9; 代码relea 阅读详情

相关推荐

opencv学习——SIFT和SURF

1、SIFT [SIFT参考] (http://blog.youkuaiyun.com/chuhang_zhqr/article/details/50890546) 原理:在前面两节我们学习了一些角点检测技术,比如Harris 等。它们具有旋转不变特性,即使图片发生了旋转,我们也能找到同样的角点。很明显即使图像发生旋转之后角点还是角点。那如果我们对图像进行缩放呢?角点可能就不再是角点了。以下图为例

ei1990的博客 1194

Opencv学习之SURF算法

Opencv学习之SURF算法 SURF(加速版的具有鲁棒性的特征,SpeededUp Robust Features),SURF是尺度不变特征变换算法(SIFT算法)的加速版。SURF最大的特征在于采用了harr特征以及积分图像的概念。 SURF原理: (1)构建Hessian矩阵构造高斯金字塔尺度空间 SIFT采用的是DoG图像,而SURF采用的是Hess

Minskyli 2万+

OpenCV2学习笔记(十二):特征提取算法SIFT与SURF

当尝试在不同图像之间进行特征匹配时,通常会遇到图像的大小、方向等参数发生改变的问题,简而言之,就是尺度变化的问题。每幅图像在拍摄时与目标物体的距离是不同的,因此要识别的目标物体在图像中自然会存在不同的尺寸。因此,计算机视觉中引入尺度不变的特征,主要的思想是每个检测到的特征点都伴随对应的尺度因子。特征提取算法SIFT与SURF算法是两种著名的特征点检测算法。

liyuefeilong的专栏 3万+

SURF原理及基于OPENCV实现

SURF原理及基于OPENCV实现

xiaohuolong的博客 4049

【OpenCV】第二十三章: 图像特征检测之SURF、FAST、BRIEF、OBR算法

4、由于在检测特征点时是需要对图像中所有的像素点进行检测,然而图像中的绝大多数点都不是特征点,如果对每个像素点都进行上述的检测过程,那显然是种浪费,所以FAST采用一种进行非特征点判别的方法:首先对候选点的周围90度的点(1,9,5,13)四个点进行测试,而且是先测试1和9,如果它们两个符合阈值要求再测试5和13。继SIFT和SURF后,大家在特征点检测的速度上又进行了很多的改进尝试,但速度的提升效果都不是非常明显,直到FAST算法诞生,特征点检测的速度才有了一个质的飞跃。无法计算描述符的特征点将被删除。

因为热爱所以坚持 2158

OpenCV中的SURF(Speeded-Up Robust Features 加速鲁棒特征)

上一篇博客介绍了用于关键点检测和描述的SIFT,但它相对较慢。这篇博客将介绍其优化版本——SURF(Speeded-Up Robust Features 加速鲁棒特征),它是加速版的SIFT。

qq_40985985的博客 2708

opencv4使用sift以及surf

转自:https://blog.youkuaiyun.com/Gordon_Wei/article/details/88920411 opencv4.0.1 的编译完成版本已经没有SIFT和SURF算法了, 一些算法因为专利或者未成熟的原因,不在发布的release版本中了,其中就包括SIFT和SURF,他们因为专利的原因不能用于商业,在2.x版本中,放在在nofree中,而3.x版本开始,这些方法被放入了...

martinkeith的博客 6618

OpenCV 入门教程:SIFT和SURF特征描述

SIFT (尺度不变特征变换)和 SURF (加速稳健特征)是图像处理中常用的特征描述算法,用于提取图像中的关键点和生成对应的特征描述子。这些算法具有尺度不变性、旋转不变性和光照不变性等特点,适用于图像匹配、目标识别和三维重建等应用。本文将以 SIFT 和 SURF 特征描述为中心,为你介绍使用 OpenCV 进行特征提取的基本原理、步骤和实例。

小蓝枣的博客 1910

【OpenCV】OpenCV 4 下 SIFT、SURF的使用

opencv4.0.1 的编译完成版本已经没有SIFT和SURF算法了, 一些算法因为专利或者未成熟的原因,不在发布的release版本中了,其中就包括SIFT和SURF,他们因为专利的原因不能用于商业,在2.x版本中,放在在nofree中,而3.x版本开始,这些方法被放入了opencv_contrib中,如果想使用需要自己编译到opencv中。 这里需要自己编译OpenCV4.0.1 + ope...

GordonWei 4万+

opencv实现surf算法

本代码可以让用户在vs平台上结合opencv实现对两幅图像的匹配,只需要将文件中的图片名称改一下,换成自己图像名称就可以,简单好用

【模型转换】将.mindir文件转换成.ms文件(Windows篇)

首先需要在MindSpore中训练好并经过评估可用的模型,可以以标准格式(例如onnx, mindir等)导出,得到.mindir模型文件(例如lenet.mindir)。为了将模型部署到自定义应用中,还需要将其转换为更为紧凑和高效的ms格式模型,用于在MindSpore-Lite环境中推理,这可以通过MindSpore Lite提供的模型转换工具converter_lite完成。

qq_42962847的博客 1425

OpenCV使用SURF和SIFT算法报错解决记录

回退OpenCV版本,解决OpenCV调用SURF和SIFT报错的问题。

qq_46082765的博客 1万+

Rust Reqwest+Rustls 自签名证书校验

所以这里必须保证reqwest引用的rustls库和本地工程一致。以上就是实现不校验签名的逻辑,后续自己可以在对应回调进行逻辑判断。

bawomingtian123的专栏 1354

OpenCV—python 角点特征检测之二(SIFT、SURF、ORB)

角点检测一、SIFT(Scale-Invariant Feature Trans-form)1.1 尺度空间极值检测1.2关键点(极值点)定位1.3 为关键点(极值点)指定方向参数1.4 关键点描述符1.5 关键点匹配二、 SURF(Speeded-Up Robust Features) 一、SIFT(Scale-Invariant Feature Trans-form) D.Lowe 于2004...

红叶谷 wsp_1138886114的博客 1万+

【DDSCAT——离散偶极近似仿真程序05】模型设计Matlab代码:多核壳球 、多核壳圆柱

简洁明了,后面及部分给出的都是模型设计的Matlab代码,这些代码都来自于一篇文章:Chin C W S. Localized Surface Plasmon Resonance with the use of Silver and Titanium Oxide Nanostructures[J]. 2011. 一、设计多个核壳球形结构 1)Matlab代码 ...

XD_Yangf的博客 4259

lidar360 V8.0 & lidar360MLS V8.0雷达点云数据处理软件

机载林业 — 基于机载激光雷达点云数据提取一系列森林结构参数(如:高度分位数、叶面积指数、郁闭度等),分割单木并提取单木参数(包括树的位置、树高、胸径、枝下高、冠幅等属性),利用软件的多种回归分析功能可以结合地面调查数据反演森林生物量、蓄积量等功能参数。还可以生成等高线、山体阴影、坡度、坡向、粗糙度等多种产品。分类 — LiDAR360提供多种分类功能,包括地面点分类、模型关键点分类、选择区域地面点分类、机器学习模型分类(可高效地分离建筑、植被、路灯等通用类别)、深度学习模型分类、自定义深度学习分类等。

2403_83796253的博客 5151

OpenCV - SIFT-SURF(Python实现)

实现步骤 cv2.xfeatures2d.SIFT_create(实例化sift) sift.detect(找出关键点) cv2.drawKeypoints(画出关键点) sift.compute(根据关键点计算sift向量) 参数 sift = cv2.xfeatures2d.SIFT_create() 参数说明:sift为实例化的sift函数 kp = sift.detect(gray,...

C橘子 4624

USB3.0一致性测试方案

为各测试项目具体测试结果包括脉冲串突发时间、脉冲串重复时间、时钟周期以及眼图等完整USB3.0测试项目,工程师可以看到各项测试的具体结果方便观察。RIGOL 提供了一套完善的工具,包括数字示波器、专业的测试夹具以及全自动一致性测试软件,使得USB 3.0设备设计人员能够高效精确地进行信号捕捉、测试与分析。报告第二部分测试摘要,在此可以看到USB3.0测试所有测试项目,并且可以观看到测试是否正常,可以帮助工程师更好的判断测试结果。,以简化下载、存储以及对于多媒体的大量内容的共享。

2409_87378937的博客 2530

Opencv实现Sift、Surf、ORB特征提取与匹配

Opencv实现Sift、Surf、ORB特征提取与匹配

qq_38338086的博客 3675

SiamFC++笔记

SiamFC++: Towards Robust and Accurate Visual Tracking with Target Estimation Guidelines 文章根据这些思路:引入分类和目标状态估计分支(G1),无歧义的分类得分(G2),无先验知识的跟踪(G3)和评估质量得分(G4)来设计SiamFC ++。 SiamRPN ++和SiamFC ++的比较(红色部分代表得分高的区域): guide: G1 : 分类和状态估计任务的分离:分类任务将目标从干扰物和背景中分类出来,目标状态

木木JL的博客 9433

Qt入门教程100篇(已完结)

Qt5入门教程,Qt6入门教程。包含了: Qt环境搭建篇、Qt数据类型篇、Qt中STL篇、Qt核心篇、Qt核心对象QObject篇、Qt基础控件篇、Qt对话框篇、Qt高级控件篇、Qt数据模型篇、QSS篇、Qt文件篇 、Qt硬件编程、Qt的一些demo、Qt项目开发篇。......

小鱼酱的博客 15万+

OpenCV - SIFT/SURF

OpenCV - SIFT Python 1.OpenCV中使用SIFT首先安装的包: 打开终端安装:sudo pip install opencv-contrib-python==3.4.2.16 新版的opencv可能没有xfeatures2d。 2. SIFT提取特征:用于检测斑点 import cv2 from matplotlib import pyplot as plt path...

Understand-image 572

深度学习实战42-基于大模型开发MathGPT的原理介绍,让数学问题智能解答变为可能

大家好,我是微学AI,今天给大家介绍一下深度学习实战42-基于大模型开发MathGPT的原理介绍,让数学问题智能解答变为可能。在去年ChatGPT的发布后,各种国内外的大语言模型层出不穷涌现,但是大家都知道现在的模型的诟病的数学能力不足,就算是简单的数学题都可能算错,今天我就来给大家引入MathGPT的模型,用来解决GPT解决数学问题,对于简单的初中数学高中数学都可以解决,让数学问题精准答题得到实现。

微学AI的博客 1649

surf和sift算法被申请专利后部分opencv版本无法使用后的安装pycharm+opencv使用surf和sift算法教程

安装pycharm+opencv使用surf和sift算法surf和sift算法在pycharm中的问题安装过程使用的软件版本安装步骤一、pycharm的安装二、尝试打开pycharm三、opencv的安装如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTe...

qq_41840148的博客 6836

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

基于Opencv的SIFT、SURF、HOG的实现

SIFT实现代码: #include<opencv2/opencv.hpp> #include<opencv2/xfeatures2d.hpp> #include<iostream> using namespace std; using namespace cv; using namespace cv::xfeatures2d; int main(int arg...

是个努力精啊! 1010

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

OpenCV 实现 SIFT→SURF 算法关键点检测实现

读取图像#2 sift关键点检测#2.1 实例化sift对象#2.2 关键点检测 : kp关键点信息包括 方向、尺度、位置信息,des是关键点的描述符#2.3 在图像上绘制关键点的检测结果#图像的显示plt.imshow(img[:,:,:-1]),plt.title("sift 关键点检测")plt.show()

qq_53545309的博客 1248

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

上一篇: surf算法
下一篇: opencv中HOGDescriptor类说明
淡淡的生活
博客等级 码龄16年 341粉丝 8原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值