SIFT\SURF\ORB

1、SURF原理
https://www.cnblogs.com/mvision/p/7992116.html
https://www.cnblogs.com/urglyfish/p/12460060.html

https://blog.csdn.net/qq_30815237/article/details/86545950?biz_id=102&utm_term=SURF%20%E5%B0%BA%E5%BA%A6%E7%A9%BA%E9%97%B4&utm_medium=distribute.pc_search_result.none-task-blog-2blogsobaiduweb~default-4-86545950&spm=1018.2118.3001.4187
2、SIFT尺度性理解
https://blog.csdn.net/u014485485/article/details/78681086
3、为什么用局部特征
从直观的人类视觉印象来看,人类视觉对物体的描述也是局部化的,基于局部不变特征的图像识别方法十分接近于人类视觉机理,通过局部化的特征组合,形成对目标物体的整体印象,这就为局部不变特征提取方法提供了生物学上的解释,因此局部不变特征也得到了广泛应用。
4、SURF为什么计算小波响应?
以小波响应近似代替梯度。
SURF can accelerate the SIFT operator by using the
responses of Haar wavelets to approximate gradient com-
putation;
5、image patch是指一小块图像。
6、Opencv中提取ORB的函数的各个参数

ORB::ORB(int nfeatures=500, float scaleFactor=1.2f, int nlevels=8, int edgeThreshold=31, int firstLevel=0, int WTA_K=2, int scoreType=ORB::HARRIS_SCORE, int patchSize=31)

nfeatures - 最多提取的特征点的数量;
scaleFactor - 金字塔图像之间的尺度参数,类似于SIFT中的k;
nlevels – 高斯金字塔的层数;
edgeThreshold – 边缘阈值,这个值主要是根据后面的patchSize来定的,靠近边缘edgeThreshold以内的像素是不检测特征点的。
firstLevel - 看过SIFT都知道,我们可以指定第一层的索引值,这里默认为0。
WET_K - 用于产生BIREF描述子的 点对的个数,一般为2个,也可以设置为3个或4个,那么这时候描述子之间的距离计算就不能用汉明距离了,而是应该用一个变种。OpenCV中,如果设置WET_K = 2,则选用点对就只有2个点,匹配的时候距离参数选择NORM_HAMMING,如果WET_K设置为3或4,则BIREF描述子会选择3个或4个点,那么后面匹配的时候应该选择的距离参数为NORM_HAMMING2。
scoreType - 用于对特征点进行排序的算法,你可以选择HARRIS_SCORE,也可以选择FAST_SCORE,但是它也只是比前者快一点点而已。
patchSize – 用于计算BIREF描述子的特征点邻域大小。
7、SURF和SIFT函数的参数

#include <iostream>
#include "opencv2/core.hpp"
#include "opencv2/features2d.hpp"
#include "opencv2/xfeatures2d.hpp"
#include "opencv2/highgui.hpp"
#include <opencv2/imgproc.hpp>
 
using namespace std;
using namespace cv;
using namespace cv::xfeatures2d;
using cv::xfeatures2d::SiftFeatureDetector;
cv::Ptr<SiftFeatureDetector> siftdtc = SiftFeatureDetector::create(nfeature);//nfeature是提取多少个特征点
Ptr<SURF> detector = SURF::create(minHessian);//minHessian为Hessian 矩阵行列式响应值的阈值,不是提取多少个特征点,minHessian越大,提取的特征点数目越少,minHessian越小,提取的特征点数目越多。
//SURF 类的构造函数为:
SURF::SURF(double hessianThreshold, int nOctaves=4, int nOctaveLayers=2, bool extended=true,
bool upright=false )

hessianThreshold 为Hessian 矩阵行列式响应值的阈值
nOctaves 为图像堆的组数
nOctaveLayers 为图像堆中每组中的中间层数,该值加2 等于每组图像中所包含的层数
extended 表示是128 维描述符,还是64 维描述符,为true 时,表示128 维描述符
upright 表示是否采用U-SURF 算法,为true 时,采用U-SURF 算法

SURF 类的重载运算符( )为:
void SURF::operator()(InputArray _img, InputArray _mask, CV_OUT vector& keypoints,
OutputArray _descriptors, bool useProvidedKeypoints)//_img 表示输入8 位灰度图像,_mask 为掩码矩阵,useProvidedKeypoints 表示是否运行关键点的检测,该值为true 表示不进行关键点的检测,而只是利用输入的关键点进行关键点描述符的运算。
cv::SURF surf;//定义类实例
surf(img, mascara,key_points,descriptors); //默认先进行关键点检测,然后进行关键点描述符的运算
surf(img, mascara,key_points,descriptors, true); //设为true表示使用提供好的keypoints,直接提取特征
int minHessian = 2000;
Ptr<SURF> detector = SURF::create(minHessian);
std::vector<KeyPoint> keyPoint1;
 detector->detect(img1.rowRange(300,400).colRange(300,400),keyPoint1);
 FAST(img1.rowRange(300,400).colRange(300,400),
                     keyPoint1,50,true);//用这两种方法提取的特征点的坐标都在(0,100)之间,而不是(300,400)之间。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值