SIFT图像特征点检测实验报告
- 格式:docx
- 大小:2.63 MB
- 文档页数:10
重庆交通大学信息科学与工程学院《多媒体技术》课程实验报告/作业(7)
班级:物联1501
姓名-学号:李怿欣
实验项目名称:图像SIFT特征
实验项目性质:设计性
实验所属课程:《多媒体技术》
实验室(中心):南岸校区语音大楼8楼机房
指导教师:娄路
上机实验时间: 2018 年 5 月 19 日
教师评阅意见:
签名:年月日实验成绩:
一、实验内容
1. 理解和实践SIFT特征提取与匹配。
自己拍摄两张有部分区域重叠的照片,使用opencv的特
征提取、匹配函数实现两张图片的SIFT特征提取和匹配,并
绘制特征点在匹配前和匹配后的连线。
2. 全景图片的生成练习。
旋转相机拍摄多张室内或室外图片,然后利用opencv的相
关函数完成一幅全景图片的制作,并解释全景图片的实现过
程。
二、实验要求
1. 分组要求:每个学生独立完成,即1人1组。
2. 程序及报告文档要求:具有较好的可读性,如叙述准确、标注明确、截图清晰等。
三、实验过程介绍
1.SIFT特征提取与匹配
#include "highgui/highgui.hpp"
#include "opencv2/nonfree/nonfree.hpp"
#include "opencv2/legacy/legacy.hpp"
using namespace cv;
int main(int argc, char *argv[])
{
Mat image01 = imread("C:\\Users\\Administrator\\Desktop\\1.jpg");
Mat image02 = imread("C:\\Users\\Administrator\\Desktop\\2.jpg");
Mat image1, image2;
GaussianBlur(image01, image1, Size(3, 4), 0.5);
GaussianBlur(image02, image2, Size(3, 4), 0.5);
SiftFeatureDetector siftDetector(30);
vector
siftDetector.detect(image1, keyPoint1);
siftDetector.detect(image2, keyPoint2);
drawKeypoints(image1, keyPoint1, image1, Scalar::all(-1), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
drawKeypoints(image2, keyPoint2, image2, Scalar::all(-1), DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
namedWindow("KeyPoints of image1", 0);
namedWindow("KeyPoints of image2", 0);
imshow("KeyPoints of image1", image1);
imshow("KeyPoints of image2", image2);
SiftDescriptorExtractor siftDescriptor;
Mat imageDesc1, imageDesc2;
pute(image1, keyPoint1, imageDesc1);
pute(image2, keyPoint2, imageDesc2);
BruteForceMatcher
vector
matcher.match(imageDesc1, imageDesc2, matchePoints, Mat());
Mat imageOutput;
drawMatches(image01, keyPoint1, image02, keyPoint2, matchePoints, imageOutput);
namedWindow("out", 0);
imshow("out", imageOutput);
waitKey();
return 0;
}
实验结果:
原图:
特征提取结果:
实验中主要函数:
(1)提取特征点函数:
SiftFeatureDetector siftDetector();
(2)特征点描述函数:
pute(image1, keyPoint1, imageDesc1);
(3)特征点匹配并显示匹配结果
drawMatches(image01, keyPoint1, image02, keyPoint2, matchePoints, imageOutput);
namedWindow("out", 0);
2.全景图片的生成练习
#include
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/stitching/stitcher.hpp"
#include
using namespace cv;
using namespace std;
bool try_use_gpu = false;
vector
int main(int argc, char* argv[])
{}
Mat img = imread("C:\\Users\\Administrator\\Desktop\\1.jpg"); imgs.push_back(img);
img = imread("C:\\Users\\Administrator\\Desktop\\2.jpg"); imgs.push_back(img);
img = imread("C:\\Users\\Administrator\\Desktop\\3.jpg"); imgs.push_back(img);
Mat pano;
Stitcher stitcher = Stitcher::createDefault(false);
Stitcher::Status status = stitcher.stitch(imgs, pano);//拼接namedWindow("all", 0);
imshow("all", pano);
imwrite("("C:\\Users\\Administrator\\Desktop\\out.jpg");", pano); waitKey();
return 0;
}
void parseCmdArgs(int argc, char** argv)
{
for (int i = 1; i