资源简介
一种通用的sift-surf-orb的程序,只需要改变相应的关键字就可以检测不同的特征点,对于分析配准问题,三维重建是一个非常好的资源。同时,代码进行了ransac优化。可供工程实际应用
代码片段和文件信息
#include
#include
#include
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
int main()
{
initModule_nonfree();//初始化模块,使用SIFT或SURF时用到
Ptr detector = new cv::SurfFeatureDetector(1500110);//创建SIFT特征检测器,可改成SURF/ORB
PtrriptorExtractor> descriptor_extractor = new cv::SurfDescriptorExtractor();//创建特征向量生成器,可改成SURF/ORB
PtrriptorMatcher> descriptor_matcher = DescriptorMatcher::create( “BruteForce“ );//创建特征匹配器
if( detector.empty() || descriptor_extractor.empty() )
cout<<“fail to create detector!“;
//读入图像
Mat img1 = imread(“AutoSaveR12820.png“0);
Mat img2 = imread(“AutoSaveL12820.png“0);
//特征点检测
double t = getTickCount();//当前滴答数
vector m_LeftKeym_RightKey;
//detector->detect( img1 m_LeftKey );//检测img1中的SIFT特征点,存储到m_LeftKey中
detector->detect(img2 m_RightKey);
//cout<<“图像1特征点个数:“< cout<<“图像2特征点个数:“<
//根据特征点计算特征描述子矩阵,即特征向量矩阵
Mat descriptors1descriptors2;
//descriptor_extractor->compute( img1 m_LeftKey descriptors1 );
descriptor_extractor->compute( img2 m_RightKey descriptors2 );
t = ((double)getTickCount() - t)/getTickFrequency();
cout<<“SIFT算法用时:“<
cout<<“图像1特征描述矩阵大小:“<riptors1.size()
<<“,特征向量个数:“<riptors1.rows<<“,维数:“<riptors1.cols< cout<<“图像2特征描述矩阵大小:“<riptors2.size()
<<“,特征向量个数:“<riptors2.rows<<“,维数:“<riptors2.cols<
//画出特征点
Mat img_m_LeftKeyimg_m_RightKey;
drawKeypoints(img1m_LeftKeyimg_m_LeftKeyScalar::all(-1)0);
drawKeypoints(img2m_RightKeyimg_m_RightKeyScalar::all(-1)0);
//imshow(“Src1“img_m_LeftKey);
//imshow(“Src2“img_m_RightKey);
double tt = getTickCount();
//特征匹配
vector matches;//匹配结果
descriptor_matcher->match( descriptors1 descriptors2 matches );//匹配两个图像的特征矩阵
cout<<“Match个数:“<
//计算匹配结果中距离的最大和最小值
//距离是指两个特征向量间的欧式距离,表明两个特征的差异,值越小表明两个特征点越接近
double max_dist = 0;
double min_dist = 100;
for(int i=0; i {
double dist = matches[i].distance;
if(dist < min_dist) min_dist = dist;
if(dist > max_dist) max_dist = dist;
}
cout<<“最大距离:“< cout<<“最小距离:“<
//筛选出较好的匹配点
vector goodMatches;
for(int i=0; i {
if(matches[i].distance < 0.6 * max_dist)
{
goodMatches.push_back(matches[i]);
}
}
cout<<“goodMatch个数:“<
//画出匹配结果
Mat img_matches;
//红色连接的是匹配的特征点对,绿色是未匹配的特征点
drawMatches(img1 m_LeftKey img2 m_RightKey goodMatches img_matches
Scalar::all(-1)/*CV_RGB(25500)*/CV_RGB(02550)Mat()2);
- 上一篇:编译原理课设--词法分析、语法和语义分析
- 下一篇:词法分析 编译原理 c++
相关资源
- omni CORBA 中间件
- ORB特征点提取
- SIFT检测特征点及特征点描述
- 三维重建 特征点提取 立体匹配
- Sift特征点提取与匹配opencv库
- 基于SIFT算法的图像拼接--C语言实现
- surf特征提取与匹配
- c实现的sift算法源代码
- SIFT特征提取C++
- 基于SIFT多幅图像拼接系统 毕设源码
- vc下的sift程序
- SIFT算法_全景图像拼接VC源码有中文注
- SURF特征点检测 程序 by浅墨
- 计算轨道的程序,很有用的
- 基于SIFT特征全景图像拼接C语言实现
- 基于SURF的特征检测程序 VC6.0下可以直
- 纯C语言写的sift算法,亲测,可用,可
- sift算法C++opencv实现代码
- sift算法的C源码(网上唯一原创版本不
- BOW+SIFT特征提取OpenCV实现
- surfsift算法配准,利用Ransac去除误匹配
- opencv实现surf算法
- 基于TAO的CORBA程序设计
- SIFT代码,C/C++
- isosurface
- surf+ransac匹配
- 基于C#平台开发的surf算法,可直接运
- SURF源码 win C++
- Opencv3中SIFT算法详解
评论
共有 条评论