关于sift算法java的信息
华为云服务器特价优惠火热进行中! 2核2G2兆仅需 38 元;4核4G3兆仅需 79 元。购买时间越长越优惠!更多配置及优惠价格请咨询客服。
合作流程: |
本篇文章给大家谈谈sift算法java,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
微信号:cloud7591如需了解更多,欢迎添加客服微信咨询。
复制微信号
本文目录一览:
java 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
// opencv_empty_proj.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include opencv.hpp
#include features2d/features2d.hpp
#includenonfree/nonfree.hpp
#includelegacy/legacy.hpp
#include
using namespace std;
using namespace cv;
int _tmain(int argc, _TCHAR* argv[])
{
const char* imagename = "img.jpg";
//从文件中读入图像
Mat img = imread(imagename);
Mat img2=imread("img2.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;
vectorkp1,kp2;
siftdtc.detect(img,kp1);
Mat outimg1;
drawKeypoints(img,kp1,outimg1);
imshow("image1 keypoints",outimg1);
KeyPoint kp;
vector::iterator itvc;
for(itvc=kp1.begin();itvc!=kp1.end();itvc++)
{
cout"angle:"angle"\t"class_id"\t"octave"\t"pt"\t"responseendl;
}
siftdtc.detect(img2,kp2);
Mat outimg2;
drawKeypoints(img2,kp2,outimg2);
imshow("image2 keypoints",outimg2);
SiftDescriptorExtractor extractor;
Mat descriptor1,descriptor2;
BruteForceMatcherL2 matcher;
vector matches;
Mat img_matches;
extractor.compute(img,kp1,descriptor1);
extractor.compute(img2,kp2,descriptor2);
imshow("desc",descriptor1);
coutendldescriptor1endl;
matcher.match(descriptor1,descriptor2,matches);
drawMatches(img,kp1,img2,kp2,matches,img_matches);
imshow("matches",img_matches);
//此函数等待按键,按键盘任意键就返回
waitKey();
return 0;
}
使用Java语言进行图像编程处理(涉及SIFT算法),是该学习Javacv、swt吗?求教大师~~
应该先从你兴趣开始,有兴趣再决定编程领域,有了编程领域在决定语言.
不同的语言对应着不同编程领域,如果你要学完那是有点不现实.
因此你要回想一下你兴趣来源是什么?比如喜欢做黑客,喜欢研究反病毒,喜欢为Windows桌面开发一些实用的小软件等等.
要分析好兴趣来由,在决定你的发展方向,就好了.
比如你喜欢为WINDOWS开发软件,那么 C语言是必备基础,学好好了然后在扩展一门面向对象的语言比如C++ C# JAVA 等.这些是不错的选择。
然后光有语言不行,为了软件的质量保证,还需要研究一下系统理论基础,这样你的软件才能做到对系统的作家兼容性和获取最佳性能。
也可百度一下, 80x86汇编小站, 这个网站里面有几篇关于编程入门文章或许会对你有帮助, 或者 你直接联系 这个站长 跟他交流编程方面的事情。 赞同
0| 评论
2011-10-30 13:44 诺言已成空白 | 二级
sift算法
SIFT算法主要分为四个步骤:
1、尺度空间极值检测(Scale-space extrema detection):通过使用高斯差分函数来搜索所有尺度上的图像位置,识别出其中对于尺度和方向不变的潜在兴趣点。
2、关键点定位(Keypoint localizatio):在每个候选位置上,利用一个拟合精细的模型确定位置、和尺度,关键点的选择依赖于它们的稳定程度。
3、方向匹配(Orientation assignment,为每个关键点赋予方向):基于局部图像的梯度方向,为每个关键点位置分配一个或多个方向,后续所有对图像数据的操作都是基于相对关键点的方向、尺度和位置进行变换,从而获得了方向于尺度的不变性。
4、关键点描述符(Keypoint descriptor):在每个关键点领域内,以选定的尺度计算局部图像梯度,这些梯度被变换成一种表示,这种表示允许比较大的局部形状的变形和光照变化。

sift算法java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、sift算法java的信息别忘了在本站进行查找喔。
