这篇文章主要介绍了a*算法代码 python,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。
1、python哪个版本opencv可以直接调用sift
这几天继续在看Lowe大神的SIFT神作,看的眼花手脚抽筋。也是醉了!!!!实在看不下去,来点干货。我们知道opencv下自带SIFT特征检测以及MATCH匹配的库,这悔尘些库完全可以让我们进行傻瓜似的操作。但实际用起来的时候还不是那么简单。下文将对一个典型的基于OPENCV的SIFT特征点提取以及匹配的例程进行分析,并由此分析详细的对OPENCV中SIFT算法的使用进行一个介绍。
OPENCV下SIFT特征点提取与匹配的大致流程如下:
读取图片-》特征点检测(位置,角度,层)-》特征点描述的提取(16*8维的特征向量)-》匹配-》显示
其中,特征点提取主要有两个步骤,见上行黄子部分。下面做具体分碧亮禅析。
1、使用opencv内置的库读取两幅图片
2、生成一个SiftFeatureDetector的对象,这个对象顾名思义就是SIFT特征的探测器,用它来探测衣服图片中SIFT点的特征,存到一个KeyPoint类型的vector中。这里有必要说keypoint的数据结构,涉及内容较多,具体分析查看opencv中keypoint数据结构分析,里面讲的自认为讲的还算详细(表打我……)。简而言之最重要的一点在于:
keypoint只是保存了opencv的sift库检测到的特征点的一些基本信息,但sift所提取出来的特征向量其实不是在这个里面,特征向量通过SiftDescriptorExtractor 提取,结果放在一个Mat的数据结构中。这个数据结构才真正保存了该特征点所对应的特征向量。具体见后文对SiftDescriptorExtractor 所生成的对象的详解。
就因为这点没有理解明白耽误了一上午的时间。哭死!
3、对图像所有KEYPOINT提取其特征向量:
得到keypoint只是达到了关键点的位置,方向等信息,并无该特征点的特征向量,要想提取得到特征向量就还要进行SiftDescriptorExtractor 的工作,建立了SiftDescriptorExtractor 对象后,通过该对象,对之前SIFT产生的特征点进行遍历,找到该特征点所对应的128维特征向量。具体方法参见opencv中SiftDescriptorExtractor所做的SIFT特征向量提取工作简单分析。通过这一步后,所有keypoint关键点的特征向量被保存到了一个MAT的数据结构中,作为特征。
4、对两幅图的特征向量进行匹配,得到匹配值。
两幅图片的特征向量被提取出来后,我们就可以使用BruteForceMatcher对象对两幅图片的descriptor进行匹配,得到匹配的结果到matches中,这其中具体的匹配方法暂没细看,过段时间补上。
至此,SIFT从特征点的探测到最后的匹配都已经完成,虽然匹配部分不甚了解,只扫对于如何使用OPENCV进行sift特征的提取有了一定的理解。接下来可以开始进行下一步的工作了。
附:使用OPENCV下SIFT库做图像匹配的例程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <>
#include <>
#include<>
#include<>
#include<vector>
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
const char* imagename = "";
//从文件中读入键源图像
Mat img = imread(imagename);
Mat img2=imread("");
//如果读入图像失败
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;
vector<KeyPoint>::iterator itvc;
for(itvc=kp1.begin();itvc!();itvc++)
{
cout<<"angle:"<<itvc->angle<<"\t"<<itvc->class_id<<"\t"<<itvc->octave<<"\t"<<itvc->pt<<"\t"<<itvc->response<<endl;
}
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);
imshow("desc",descriptor1);
cout<<endl<<descriptor1<<endl;
matcher.match(descriptor1,descriptor2,matches);
drawMatches(img,kp1,img2,kp2,matches,img_matches);
imshow("matches",img_matches);
//此函数等待按键,按键盘任意键就返回
waitKey();
return 0;
}
2、sift算法
SIFT算法主要分为四个步骤:
1、尺度空间极值检测(Scale-space extrema detection):通过使用高斯差分函数来搜索所有尺度上的图像位置,识别出其中对于尺度和方向不变的潜在兴趣点。
2、关键点定位(Keypoint localizatio):在每个隐键候选位置上,利用一个拟合精细的模型确定位置、和尺度,关键点的选择依赖于它们兄携运的稳定程度。
3、方向匹配(Orientation assignment,为每个关键点赋予方向):基于局部图像的梯度方向,为每个关键点位置分配一个或多个方向,后续所有对图像数据的操作都是基于相对关键点的方向、尺度和位置进行变换,从而获得了方向于尺度的不变性。
4、关键点描述符(Keypoint descriptor):在每个关键点领域内,以选定的尺度计算局部图像梯度,这些梯度被羡梁变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。
3、如何使用SIFT进行角点匹配?
一、特征点(角点)匹配
图像匹配能够应用的场合非常多,如目标跟踪,检测,识别,图像拼接等,而角点匹配最核心的技术就要属角点匹配了,所谓角点匹配是指寻找两幅图像之间的特征像素点的对应关系,从而确定两幅图像的位置关系。
角点匹配可以分为以下四个步骤:
1、提取检测子:在两张待匹配的图像中寻找那些最容易识别的像素点(角点),比如纹理丰富的物体边缘点等。
2、提取描述子:对于检测出的角点慎渣,用一些数学上的特征对其进行描述,如梯度直方图,局部随机二值特征等。检测子和描述子的常用提取方法有:sift,harris,surf,fast,agast,brisk,freak,brisk,brief/orb等。
3、匹配:通过各个角点的描述子来判断它们在两张图像中的对应关系,常用方法如 flann等。
4、消噪:去除错误匹配的外点,保留正确的匹配点。常用方法有KDTREE,BBF,Ransac,GTM等。
二、SIFT匹配方法的提出
为了排除因为图像遮挡和背景混乱而产生的无匹配关系的关键点,SIFT的作者Lowe提出了比较最近邻距离与次近邻距离的SIFT匹配方式:取一幅图像中的一个SIFT关键点,并找出其与另一幅图像中欧式距离最近的前两个关键点,在这两个关键点中,如果最近的距离除以次近的距离得到的比率ratio少于某个阈值T,则接受这一对匹配点。因为对于错误匹配,由于特征空间的高维性,相似的距离可能有大量其他的错误匹配,从而它的ratio值比较高。显然降低这个比例阈值T,SIFT匹配点数目会减少,但更加稳定,反之亦然。
Lowe推荐ratio的阈值为0.8,但作者对大量任意存在尺度、旋转和亮度变化的两幅图片进行匹配,结果表明ratio取值在0. 4~0. 6 之雀迹间最佳,小于0. 4的很少有匹配点,大于0. 6的则存在大量错误匹配点,所以建议ratio的取值原则如下:
ratio=0. 4:对于准确度要求高的匹配;
ratio=0. 6:对于匹配点顷孝并数目要求比较多的匹配;
ratio=0. 5:一般情况下。
三、常见的SIFT匹配代码
1、vlfeat中sift toolbox中的vl_ubcmatch.c使用的是普通的欧氏距离进行匹配(该SIFT代码贡献自Andrea
Vedaldi)。
2、Lowe的C++代码中使用的是欧氏距离,但是在matlab代码中为了加速计算,使用的是向量夹角来近似欧氏距离:先将128维SIFT特征向量归一化为单位向量(每个数除以平方和的平方根),然后点乘来得到向量夹角的余弦值,最后利用反余弦(acos函数)求取向量夹角。实验证明Lowe的办法正确率和耗时都很不错。
同样,也可以采用knnsearch函数求最近点和次近点:knnsearch采用euclidean距离时得到的结果与lowe采用的近似方法结果几乎一致,正好印证了模拟欧氏距离的效果。
3、Rob Hess的OpenSIFT采用了KDTREE来对匹配进行优化。
4、CSDN大神v_JULY_v实现了KDTREE+BBF对SIFT匹配的优化和消除错误匹配:从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
- 结构之法 算法之道 - 博客频道 - 。
5、OpenCV中features2d实现的SIFT匹配有多种matcher:VectorDescriptorMatcher,BFMatcher(Brute-force descriptor matcher),FernDescriptorMatcher,OneWayDescriptorMatcher,FlannBasedMatcher 等等。目前只知道采用knnsearch,提供了多种距离度量方式,具体区别不懂。
4、sift算法是什么?
Sift算法是David Lowe于1999年提出的局部特征描述子,并于2004年进行了更深入的发展和完善。Sift特征匹配算高乎法可以处理两幅图像之间发生平移、旋转、仿射变换情况下的匹配问题,具有很强的匹配能力。
这一算法的灵感也十分的直观,人眼观测两张图片是否匹配时会注意到其中的典型区域(特征点部分),如果我们能够实现这一特征点区域提取过程,再对所提取到的区域进行胡念兆描述就可以实现特征匹配了。
sift算法的应用
SIFT算法目前在军事、工业和民用方面都得到了不同程度的应用,其应用已裤租经渗透了很多领域,典型的应用如下:物体识别;机器人定位与导航;图像拼接;三维建模;手势识别;视频跟踪;笔记鉴定;指纹与人脸识别;犯罪现场特征提取。
5、吗?一副AR眼镜是怎样炼成的
一副AR眼镜是怎样炼成的
七种AR光学方案及优缺点
1、直接投影或离轴反射
这种技术类似于投影仪,可以将影像直接投影到眼镜上,比如 Glass Up,就是在右侧镜腿上安装了一个微型投影仪,并将镜片作为反射镜,会在镜片上投射一个大小为 320×240 的区域,通过反射以后形成平行光进入人眼成像。这种方案虽无法像手机或平板电脑一样进行多任务处理,但应付一些文字信息和简单图表足够。Meta 眼镜也采用了类似技术——离轴反射镜,与标准抛物反射镜的不同之处在于,它可在特定角度下直射并聚焦入射平行光,且支持无限远焦点,造型极其紧凑的投影仪藏在镜框内,左右各有一个,由 LED 光源将半透式 LCD 上的影像投射到分光镜片上成像,从而提供了立体视觉。
2、棱镜光学
最简单的就是 45 度角棱镜,把显示器产生的光从眼镜框反射进人眼,也同时让现实世界的光透进来。这样做简单便宜,众所周知的 Google Glass 便是采用了这种方案。但由于技术限制,连 Google Glass 的缺点也很明显,视场角仅 20°左右(棱镜方式要想做大 FOV 只能做局吵银得更厚),光线需要先后经过半反半透膜层两次,光能利用率低(约为 20%),导致画面较暗。受限于制造工艺,镜片厚,提供面积大的镜片成本高、良率低。
3、自由曲面棱镜式
自由曲面指表面形状不能被连续加工的,具有传统加工成型的任意性特点的曲面,其设计难度远远高于前两类。一般情况下它的形态是一个楔形的玻璃,这种曲面是非旋转对称的 XY 多项式自由曲面。在这种结构中,光线经过该棱镜的变换,形成虚拟放大的图像,自由曲面全反射的出射面和自由曲面的反射面能消除色差和畸变等像差,因此成像质量更加清晰,视角可以达到 54 度,采用双自由曲面棱镜视角可以进一步提高。缺陷就是,体积较大,厚度约在 7-10mm。
4、光波导+全息技术
波导能够在 3mm 以内的玻璃上,实现 30-40°的视场角。它会低于一般近视眼镜的厚度,非常轻薄,因此可以和普通眼镜结合。不过,它的设计难度也是最大的。该技术的基本原理是光的全反射和衍射。如图,全息波导头盔显示系统主要由微显示器、全息光栅和平板波导组成。图像经过微型准直透镜后变成平行光进入光波导到达第一个全息光栅,由于全息光栅的衍射效应使平行光改变传输方向从而满足全反射条件并沿波导方向向前无损传播。当平行光传播到第二个全息光栅时,全反射条件被破坏从而使平行光从全息波导出射,并进入人眼成像。由于全息波导的存在,光学图像可以垂直偏转传播。这不但减小了传播距离,还可保持光学系统的重心在头部以内。同时减少了折镜的使用,从而有利于光学系统的简洁化和轻小型设计。不过,该技术智能实现单色显示,想要实现彩色效果必须采用 3 层镜片,分别投射红、绿、蓝三原光,利用不同光线的碰李融合形成彩色。目前,HoloLens 便是采用这种方案。
5、光波导+反射技术
全息光栅方案,由于衍射效应会造成色散和图像模糊。所以,以色列公司 Lumus 用到了一种 Light-guide Optical Element(LOE)器件,这桐宴种器件使用的并非全息光栅,而是更加简单的多反射层结构,如图所示。LOE 器件的原理和潜望镜类似,但是使用了多个反射镜扩展出瞳。每个反射镜反射的都是平行光,这些反射镜成同一像。其中 Lumus 的代表性产品 PD-18 分辨率为 800×600,视场角为 26°×20°,出瞳为 10mm,出瞳距为 23mm。器件厚度为 2.3mm,重量小于 70g,亮度为 1200fL,显示区透过率为 70%,其余区域透过率为 92%。
6、光场技术
光场技术作为近眼 3D 的另外一大技术路线,其代表者就是 Magic Leap。该技术最大的好处就是可以允许用户自由对焦,看远看近不至于产生传统照片或视频那样的模糊感觉。这种方法的技术核心是光导纤维投影仪(Fiber Optic Projector),基于激光在光导纤维中传播后从纤维的端口射出时输出方向和纤维相切的原理,Magic Leap 通过改变纤维在三维空间中的形状,特别是改变纤维端口处的切方向,控制激光射出的方向,直接投射到视网膜。
7、视频叠加技术
上述几种方案相对较难,视频叠加技术则可以更简单地实现 AR 效果。视频叠加技术直接利用摄像头取代透镜观察真实世界,并将虚拟事物叠加在摄像头所拍摄的场景中。该方法避免了光学设计上的难题,并且可以增强人的视觉感知能力,比如通过使用红外线摄像头,可以看见红外光谱的景象。不过,它也带来了另一个难题,那就是数据运算量极高,这个问题亟待解决。
四种“底层”AR实现方式
如果说上面的是专业技术解决方案,那么下面我们要介绍的就是专为AR技术爱好者准备的“业余”方案。
1、Opencv和C++
大致原理是OpenCV实现对Marker的识别和定位,然后通过OpenGL将虚拟物体叠加到摄像头图像下,实现增强现实。具体思路是:使用SIFT算法进行识别(特征点的提取并用特征向量对特征点描述,接着当前视图的特征向量与目标对象的特征向量进行匹配),根据识别出来的原目标和帧图像匹配关系得到变化矩阵,来显示三维物体(使用OpenGL来绘制),实现跟踪。
2、Python
Python是世界上最优雅的语言,目前的计算机视觉项目大都用Python来实现,当然用Python的CV库也可以很轻松的实现AR效果。用Python来实现AR效果,首先需要运用到两个开源的工具包PyGame与PyOpenGL。PyGame是非常流行的游戏开发工具包,它可以非常简单的处理显示窗口,输入设备,事件以及其他内容。在实现的过程中,需要获取照相机矩阵并转换到OpenGL格式,并以平面和标记物进行姿态估计,然后在图像中放置虚拟物体,实现增强现实。
3、AR+SLAM
SLAM主要用于地图重建,在AR中,通常运用SLAM算法来获取camera pose。网上有一些SLAM开发资源与AR-SLAM 项目案例,有兴趣的可以下载参考。
4、ARToolkit
ARToolKit 是一个C/C++ 语言编写的库。对于开发一个AR程序来说,最困难的部分在于实时的将虚拟图像覆盖到用户视口,并且和真实世界中的对象精确对齐。ARToolKit使用图像技术计算摄像机和标记卡之间的相对位置,从而使程序员能够将他们的虚拟对象覆盖到标记卡上面。ARToolKit 提供的快速和准确的标记跟踪,能够让人快速的开发出许多更新更有趣的AR程序。实现步骤是:程序初始化—抓取一帧进行视频的输入—然后探测标示卡—计算摄像头的转移矩阵—绘制虚拟物体—关闭视频捕捉。
6、sift特征向量的维数
基于不变量技术的特征检测方法的基础上,提出的一种基于尺度空间的、对图像缩放、旋转、、光照变化保持稳定性的图像局部特征描述算轿袭亏法-SIFT算子。SIFT特征点向量的生成由以下四步骤组成:1、在尺度空间中检测;2、去除低的极值点和不稳定的边缘极值点,得到特征点;3、计算特征点的方向参数;4、生成SIFT特征点向量,向量维数一般为128维。运用SIFT算法提取的SIFT特征点向量具有如下优点:1、SIFT特征是图像的局部特征,对旋转、尺度缩放、禅桐亮度变化保持不变化性,对视角变化、仿射变换、噪音也保持一定程度的稳定性;2、独特性好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;3、多量性,即使少数的几个物体也可以产生大量SIFT。现有的SIFT算法具有一定的缺陷,对于图像的检测效率和检测精度较差。
技术实现思路
有鉴于此,本专利技术实施例的目的在于提供一种基于改进SIFT的图像特征检测方法及装置,以解决上述技术问题。第一方面,本专利技术实施例提供了一种基于改进S...
【技术保护点】
1.一种基于改进SIFT的图像特征检测方法,其特征在于,包括:获取待检测图像和对应的标准图像;利用尺度不变特征变换SIFT算法对所述待检测图像和所述标准图像进行图像匹配,获得多对匹配点;述匹配点之间的直径比和方向角度差;根据所述邻域直径比和所述方向角度差对所述匹配点进行剔除,获得正确匹配点,以获得所述待检测图像中的特征。