Opencv图像识别从零到精通(34)---SIFI

article/2025/9/30 22:46:58

一、理论知识

  Scale Invariant Feature Transform,尺度不变特征变换匹配算法,对于算法的理论介绍,可以参考这篇文章http://blog.csdn.net/qq_20823641/article/details/51692415,里面很详细,可以更好的学习。这里就不多介绍。后面就挑选重点的来说

二、SIFT 主要思想

  SIFT算法是一种提取局部特征的算法,在尺度空间寻找极值点,提取位置,尺度,旋转不变量。

三、SIFT算法的主要特点:

 a) SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性。

b) 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配[23]

c) 多量性,即使少数的几个物体也可以产生大量SIFT特征向量。

d) 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求。

e) 可扩展性,可以很方便的与其他形式的特征向量进行联合。

四、SIFT算法步骤:

1)检测尺度空间极值点

2)精确定位极值点

3)为每个关键点指定方向参数

4)关键点描述子的生成

五、程序过程

  • 使用SiftFeatureDetector的detect方法检测特征存入一个向量里,并使用drawKeypoints在图中标识出来
  • SiftDescriptorExtractor 的compute方法提取特征描述符,特征描述符是一个矩阵
  • 使用匹配器matcher对描述符进行匹配,匹配结果保存由DMatch的组成的向量里
  • 设置距离阈值,使得匹配的向量距离小于最小距离的2被才能进入最终的结果,用DrawMatch可以显示 
六、函数简介
SIFT::SIFT(int nfeatures=0, int nOctaveLayers=3, double contrastThreshold=0.04, double edgeThreshold=  10, double sigma=1.6)  

  • nfeatures:特征点数目(算法对检测出的特征点排名,返回最好的nfeatures个特征点)。
  • nOctaveLayers:金字塔中每组的层数(算法中会自己计算这个值,后面会介绍)。
  • contrastThreshold:过滤掉较差的特征点的对阈值。contrastThreshold越大,返回的特征点越少。
  • edgeThreshold:过滤掉边缘效应的阈值。edgeThreshold越大,特征点越多(被多滤掉的越少)。
  • sigma:金字塔第0层图像高斯滤波系数,也就是σ。

void SIFT::operator()(InputArray img, InputArray mask, vector<KeyPoint>& keypoints, OutputArray  
descriptors, bool useProvidedKeypoints=false)

  • img:8bit灰度图像
  • mask:图像检测区域(可选)
  • keypoints:特征向量矩阵
  • descipotors:特征点描述的输出向量(如果不需要输出,需要传cv::noArray())。
  • useProvidedKeypoints:是否进行特征点检测。ture,则检测特征点;false,只计算图像特征描述
<p>class keyPoint{<span style="font-family: Arial;">Point2f pt;</span><span style="font-family: Arial;">float size;</span><span style="font-family: Arial;">float angle;</span><span style="font-family: Arial;">float response;i</span><span style="font-family: Arial;">nt octave;</span><span style="font-family: Arial;">int class_id;</span><span style="font-family: Arial;">}</span></p>

<span style="font-size:18px;">void drawMatches(const Mat&img1, const vector<KeyPoint>&keypoints1, const Mat&img2, const vector<KeyPoint>&keypoints2, 
const vector<DMatch>&matches1to2, Mat&outImg, const Scalar&matchColor=Scalar::all(-1), 
const Scalar&singlePointColor=Scalar::all(-1), const vector<char>&matchesMask=vector<char>(), 
intflags=DrawMatchesFlags::DEFAULT)</span>

Parameters:
  • img1 – 源图像1
  • keypoints1 –源图像1的特征点.
  • img2 – 源图像2.
  • keypoints2 – 源图像2的特征点
  • matches1to2 – 源图像1的特征点匹配源图像2的特征点[matches[i]] .
  • outImg – 输出图像具体由flags决定.
  • matchColor – 匹配的颜色(特征点和连线),若matchColor==Scalar::all(-1),颜色随机.
  • singlePointColor – 单个点的颜色,即未配对的特征点,若matchColor==Scalar::all(-1),颜色随机.
  • matchesMask – Mask决定哪些点将被画出,若为空,则画出所有匹配点.
  • flags – Fdefined by DrawMatchesFlags.

七、函数注意事项

1.生成一个SiftFeatureDetector的对象,这个对象顾名思义就是SIFT特征的探测器,用它来探测衣服图片中SIFT点的特征,存到一个KeyPoint类型的vector中,keypoint只是保存了opencv的sift库检测到的特征点的一些基本信息,但sift所提取出来的特征向量其实不是在这个里面,特征向量通过SiftDescriptorExtractor 提取,结果放在一个Mat的数据结构中。这个数据结构才真正保存了该特征点所对应的特征向量。
2.keypoint只是达到了关键点的位置,方向等信息,并无该特征点的特征向量,要想提取得到特征向量就还要进行SiftDescriptorExtractor 的工作,建立了SiftDescriptorExtractor 对象后,通过该对象,对之前SIFT产生的特征点进行遍历,找到该特征点所对应的128维特征向量

八、示例

<span style="font-size:18px;">#include <opencv2/opencv.hpp>
#include <opencv2/features2d/features2d.hpp>
#include<opencv2/nonfree/nonfree.hpp>
#include<opencv2/legacy/legacy.hpp>
#include<vector>
using namespace std;
using namespace cv;
int main(int argc,uchar* argv[])
{const char* imagename = "hand1.jpg";//从文件中读入图像Mat img = imread(imagename);Mat img2=imread("hand3.jpg");//如果读入图像失败if(img.empty()){fprintf(stderr, "Can not load image %s\n", imagename);return -1;}if(img2.empty()){fprintf(stderr, "Can not load image %s\n", imagename);return -1;}//显示图像imshow("image before", img);imshow("image2 before",img2);//sift特征检测SiftFeatureDetector  siftdtc;vector<KeyPoint>kp1,kp2;siftdtc.detect(img,kp1);Mat outimg1;drawKeypoints(img,kp1,outimg1);imshow("image1 keypoints",outimg1);KeyPoint kp;siftdtc.detect(img2,kp2);Mat outimg2;drawKeypoints(img2,kp2,outimg2);imshow("image2 keypoints",outimg2);SiftDescriptorExtractor extractor;Mat descriptor1,descriptor2;BruteForceMatcher<L2<float>> matcher;vector<DMatch> matches;Mat img_matches;extractor.compute(img,kp1,descriptor1);extractor.compute(img2,kp2,descriptor2);matcher.match(descriptor1,descriptor2,matches);drawMatches(img,kp1,img2,kp2,matches,img_matches);imshow("matches",img_matches);//此函数等待按键,按键盘任意键就返回waitKey();return 0;
}</span>




九、matlab

Demo Software: SIFT Keypoint Detector 代码参考大牛的,网址如下

http://www.cs.ubc.ca/~lowe/keypoints/

i1=imread('hand1.jpg');  
i2=imread('hand3.jpg');  
i11=rgb2gray(i1);  
i22=rgb2gray(i2);  
imwrite(i11,'v1.jpg','quality',80);  
imwrite(i22,'v2.jpg','quality',80);  
match('v1.jpg','v2.jpg');  


http://www.cnblogs.com/cj695/p/4041478.html

http://blog.csdn.net/xiaowei_cqu/article/details/8069548
图像识别算法交流 QQ群:145076161,欢迎图像识别与图像算法,共同学习与交流



http://chatgpt.dhexx.cn/article/yeVOxfvn.shtml

相关文章

32-SIFI特征点提取(EmguCV学习)

文章目录 RecordCode效果 Record 1、特征点检测与匹配常用的算法&#xff1a;FAST&#xff08;FastFeatureDetector&#xff09;、STAR&#xff08;StarFeatureDetector&#xff09;、SIFT、SURF、ORB、MSER、GFTT&#xff08;GoodFeaturesToTrackDetector&#xff09;、HARRI…

SIFI特征点提取

尺度不变特征变换匹配算法详解 Scale Invariant Feature Transform(SIFT) Just For Fun zdd zddmailgmail.com 对于初学者&#xff0c;从David G.Lowe的论文到实现&#xff0c;有许多鸿沟&#xff0c;本文帮你跨越。 1、SIFT综述 尺度不变特征转换(Scale-invariant feature tr…

图像SIFI笔记

Image/userl representation > down screen tasks 端到端的 文本领域 字典 visual word本质是 local feature handcraft feature 希望这个具有足够的泛华性 generalize 为了有交集 泛化性 clustering 聚类 Quantization 量化 每张图像 有特征点 local feature sift(128d维…

特征点匹配(SIFI)

1.SIFI https://blog.csdn.net/weixin_38404120/article/details/73740612&#xff08;参考了这个作者的内容&#xff09; 结合书上加博客的内容进行理解&#xff1b; 求取SIFI特征的步骤&#xff1a; 首先要对图像归一化&#xff0c;然后将图像扩大为原来的两倍&#xff0…

SIFI和ORB在尺度缩放、旋转、仿射上的特征点不变实验代码,并比较SIFI和ORB提取特征点的速度

SIFI和ORB在尺度缩放、旋转、仿射上的特征点不变 一、SIFI算法1.验证旋转不变性2.验证尺度不变性3.验证仿射不变性 对原图进行仿射变换并输出 二、ORB算法1.验证旋转不变性2.验证尺度不变性3.验证仿射不变性 对原图进行仿射变换并输出 三、比较SIFT和ORB的尺度旋转&#xff0c;…

向量范数简述

向量范数&#xff1a;表征在向量空间中向量的大小 一般表示&#xff1a;,其中X是n维向量&#xff0c;一般如果省略下面的p且无特别说明的话&#xff0c;指的就是2范数&#xff0c;也叫欧几里得范数。对向量来说&#xff0c;就是指向量的模。 常用的向量范数&#xff1a; 0范…

欧几里得范数/欧几里得距离(L2范数)

首先m维空间的概念: Rm的距离结构: 2维平面空间: m维空间: 范形空间距离 n维矢量空间中的元素X的Lp范数: 其中X是一连串的向量 最常用的是L2范数: 本质是一个距离概念 参考:《数学分析》

概念理解_L2范数(欧几里得范数)

L2范数 L2范数、欧几里得范数一些概念。 首先&#xff0c;明确一点&#xff0c;常用到的几个概念&#xff0c;含义相同。 欧几里得范数&#xff08;Euclidean norm&#xff09; 欧式长度 L2 范数 L2距离 Euclidean norm Euclidean length L2 norm L2 distance norm 对于一…

0范数,1范数,欧几里得范数等范数总结

以下分别列举常用的向量范数和矩阵范数的定义。 向量范数 1-范数&#xff1a; 即向量元素绝对值之和&#xff0c;matlab调用函数norm(x, 1) 。 2-范数&#xff1a; Euclid范数&#xff08;欧几里得范数&#xff0c;常用计算向量长度&#xff09;&#xff0c;即向量元素绝对值…

范数、正则化、归一化、标准化

在总结正则化&#xff08;Regularization&#xff09;之前&#xff0c;我们先谈一谈正则化是什么&#xff0c;为什么要正则化。 个人认为正则化这个字眼有点太过抽象和宽泛&#xff0c;其实正则化的本质很简单&#xff0c;就是对某一问题加以先验的限制或约束以达到某种特定目的…

常见向量范数和矩阵范数

1、向量范数 1-范数&#xff1a;&#xff0c;即向量元素绝对值之和&#xff0c;matlab调用函数norm(x, 1) 。 2-范数&#xff1a;&#xff0c;Euclid范数&#xff08;欧几里得范数&#xff0c;常用计算向量长度&#xff09;&#xff0c;即向量元素绝对值的平方和再开方&#xf…

欧氏距离,l2范数,l2-loss,l2正则化

欧式距离,l2范数,l2-loss,l2正则化 1.欧氏距离2.L2范数范数计算公式L1范数L2范数在机器学习方面的区别为什么L2范数可以防止过拟合? 3.L2-Loss4.L2正则化正则化L2正则化 参考文献 1.欧氏距离 距离度量&#xff08;Distance&#xff09;用于衡量个体在空间上存在的距离&#x…

pytorch求范数函数——torch.norm

torch.norm(input, pfro, dimNone, keepdimFalse, outNone, dtypeNone) 返回所给定tensor的矩阵范数或向量范数,所谓范数也就是把一个高纬度的东西,压缩成为一个大于等于零的数,用以估算这里东西的大小(幅度) 参数&#xff1a; input&#xff1a;输入tensorp (int, float, i…

来自知乎的范数理解

以下分别列举常用的向量范数和矩阵范数的定义。 向量范数 1-范数&#xff1a; &#xff0c;即向量元素绝对值之和&#xff0c;matlab调用函数norm(x, 1) 。 2-范数&#xff1a; &#xff0c;Euclid范数&#xff08;欧几里得范数&#xff0c;常用计算向量长度&#xff09;&…

16.1 几何空间

文章目录 1 欧几里得范数2 距离3 标准内积5 夹角与正交6 叉乘7 平行四边形法则8 欧几里得运动 几何空间是用线性代数解决几何问题的一类空间&#xff0c;这是线性代数学习绕不过去的槛。几何空间&#xff0c;学习起来我觉得吧&#xff0c;主要是三个点&#xff1a;内积、长度、…

常见向量范数和矩阵范数及其MATLAB实现

参考 常见向量范数和矩阵范数及其MATLAB实现 - 云社区 - 腾讯云 1、向量范数 1-范数&#xff1a;&#xff0c;即向量元素绝对值之和&#xff0c;matlab调用函数norm(x, 1) 。 2-范数&#xff1a;&#xff0c;Euclid范数&#xff08;欧几里得范数&#xff0c;常用计算向量长度…

MATLAB 欧几里得算法

MATLAB 欧几里得算法以及扩展欧几里得算法 前言一、Euclid算法二、Code1.引入库2.读入数据 前言 提示&#xff1a;在线性代数或高等代数中以熟悉求两个多项式最大公因子 一、Euclid算法 输入两个多项式 g(x) , h(x) ∈ F(x),满足 deg g(x) ≥ deg h(x) , 且 g(x) ≠ 0, 二、…

【 MATLAB 】norm ( Vector and matrix norms )(向量范数以及矩阵范数)

norm Vector and matrix norms Syntax n norm(v) n norm(v,p) n norm(X) n norm(X,p) n norm(X,fro) Description n norm&#xff08;v&#xff09;返回向量v的欧几里德范数。该范数也称为2范数&#xff0c;向量幅度或欧几里德长度。 n norm&#xff08;v&#…

向量范数

向量范数的定义如下&#xff1a; 若实值函数&#xff08;n维向量空间向一维向量空间的映射&#xff09;&#xff1a;满足下列条件&#xff1a; &#xff08;1&#xff09;&#xff0c;&#xff1b;当且仅当&#xff1b; &#xff08;2&#xff09;&#xff0c;&#xff0c;&…

向量和矩阵的各种范数

向量和矩阵的各种范数 一、向量的范数 首先定义一个向量为&#xff1a;a[-5&#xff0c;6&#xff0c;8, -10] 1.1 向量的1范数 向量的1范数即&#xff1a;向量的各个元素的绝对值之和&#xff0c;上述向量a的1范数结果就是&#xff1a;29&#xff0c;MATLAB代码实现为&…