资源简介
SIFT特征点匹配的代码和实验报告,需要2008的VS和openCV库。如果VS版本高的话需要下载一个2008版本的guill.gll文件。修改代码中视频路径即可实现特征点匹配。有实验报告和用例。
代码片段和文件信息
#include “opencv2/opencv.hpp“
#include “opencv2/nonfree/nonfree.hpp“//与SIFT相关
#include “opencv2/legacy/legacy.hpp“//与匹配器相关
#include
using namespace std;
using namespace cv;
const int N = 1e6 + 5;
Mat srcImg2;//比对的图片
Mat myframe[N];
int cnt;
void sift_ransac(Mat img01 Mat img02)
{
//SIFT特征检测
SiftFeatureDetector detector; //定义特点点检测器
vector keypoint01 keypoint02;//定义两个容器存放特征点
detector.detect(img01 keypoint01);
detector.detect(img02 keypoint02);
//在两幅图中画出检测到的特征点
Mat out_img01;
Mat out_img02;
drawKeypoints(img01 keypoint01 out_img01);
drawKeypoints(img02 keypoint02 out_img02);
//提取特征点的特征向量(128维)
SiftDescriptorExtractor extractor;
Mat descriptor01 descriptor02;
extractor.compute(img01 keypoint01 descriptor01);
extractor.compute(img02 keypoint02 descriptor02);
//匹配特征点,主要计算两个特征点特征向量的欧式距离,距离小于某个阈值则认为匹配
BruteForceMatcher> matcher;
vector matches;
Mat img_matches;
if (descriptor02.cols == 0 && descriptor02.rows == 0)
return;
matcher.match(descriptor01 descriptor02 matches);
drawMatches(img01 keypoint01 img02 keypoint02 matches img_matches);
//RANSAC 消除误匹配特征点 主要分为三个部分:
//根据matches将特征点对齐将坐标转换为float类型
vector R_keypoint01 R_keypoint02;
for (size_t i = 0; i {
R_keypoint01.push_back(keypoint01[matches[i].queryIdx]);
R_keypoint02.push_back(keypoint02[matches[i].trainIdx]);
}
//坐标转换
vectorp01 p02;
for (size_t i = 0; i {
p01.push_back(R_keypoint01[i].pt);
p02.push_back(R_keypoint02[i].pt);
}
//利用基础矩阵剔除误匹配点
vector RansacStatus;
Mat Fundamental = findFundamentalMat(p01 p02 RansacStatus FM_RANSAC);
vector RR_keypoint01 RR_keypoint02;
vector RR_matches; //重新定义RR_keypoint 和RR_matches来存储新的关键点和匹配矩阵
int index = 0;
for (size_t i = 0; i {
if (RansacStatus[i] != 0)
{
RR_keypoint01.push_back(R_keypoint01[i]);
RR_keypoint02.push_back(R_keypoint02[i]);
matches[i].queryIdx = index;
matches[i].trainIdx = index;
RR_matches.push_back(matches[i]);
index++;
}
}
Mat img_RR_matches;
drawMatches(img01 RR_keypoint01 img02 RR_keypoint02 RR_matches img_RR_matches);
std::vector obj;
std::vector scene;
for (int i = 0; i < RR_matches.size(); i++)
{
obj.push_back(RR_keypoint01[RR_matches[i].queryIdx].pt);
scene.push_back(RR_keypoint02[RR_matches[i].trainIdx].pt);
}
if (RR_matches.size() == 0)
{
myframe[cnt++] = img_RR_matches;
return;
}
Mat H = findHomography(obj scene CV_RANSAC);
std::vector obj_corners(4);
obj_corners[0] = cvPoint(0 0); obj_corners[1] = cvPoint(img01.cols 0);
obj_corners[2] = cvPoint(img01.cols img01.rows); obj_corners[3] = cvPoint(0 img01.rows);
std::vector scene_corners(4);
perspectiveTransform(obj_corners scene_corners H);
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2017-12-24 14:02 1120151964-李欣欣\
文件 11143266 2017-12-23 17:32 1120151964-李欣欣\output.avi
文件 10015 2017-12-23 17:17 1120151964-李欣欣\src.jpg
文件 1311317 2017-12-23 17:27 1120151964-李欣欣\src.mp4
文件 4478 2017-12-24 12:44 1120151964-李欣欣\源.cpp
文件 1425310 2017-12-24 14:01 1120151964-李欣欣\程序报告.docx
相关资源
- 基于SIFT特征的全景图像拼接(Qt)
- OPENCV实现ORB/SURF/SIFT + RANSAC 图像自动拼
- SIFT特征提取3篇最经典文献
- sift算法fpga实现
- SIFT算法实现及代码详解
- 论文研究-SIFT和改进的RANSAC算法在图像
- opencv实现的SIFT特征提取与匹配算法
- 基 于 SI FT特 征 的 图 像 自 动 拼 接
- 点云配准SIFT算法
- SIFT+LBP算法实现代码
- 使用GPU加速的SIFT算法
- ASIFT算法实现
- sift图像匹配
- 基于SIFT+Kmeans+SVM的场景识别报告
- 基于SIFT特征点的双目视觉定位
- SURF、SIFT、ORB特征提取opencv程序
- sift、surf、sift+ransac方法影像匹配代码
- 航拍图片全景拼接代码
- sift动态背景下实现目标跟踪
- OpenCV3.0实现SIFT特征提取+RANSAC剔除误匹
- David G.Lowe的sift算法中文翻译
- SIFT opencv 源代码
- featerMatch.rar
- sift和surf的比较
- 基于SIFT的图像拼接算法
- sift算法实现双目测距
- CUDA加速实现的sift图像配准+颜色校正
- sift和颜色直方图特征匹配
- SIFT实现特征点提取和匹配
- PCA-SIFT源码
评论
共有 条评论