• 大小: 12.77MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-06-20
  • 语言: 其他
  • 标签: SIFT  

资源简介

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

评论

共有 条评论