opencv SIFT特征匹配,可自动选择最佳的20个匹配结果

#include <opencv2\highgui\highgui.hpp>
#include <opencv2\features2d\features2d.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\nonfree\nonfree.hpp>
#include <opencv2/legacy/legacy.hpp> 
#include <iostream>


using namespace std;
using namespace cv;


int main()
{
Mat im1 = imread("1.jpg");
Mat im2 = imread("11.jpg");
Mat image1, image2;
resize(im1, image1, Size(int(im1.cols*0.25),int(im1.rows*0.25)));
resize(im2, image2, Size(int(im2.cols*0.25),int(im2.rows*0.25)));
Mat image3 = image1.clone();
Mat image4 = image2.clone();
//Sift检测器
SiftFeatureDetector detector;


//保存两幅图像得到的特征点
vector<KeyPoint> image1KeyPoint, image2KeyPoint;


//检测特征点
detector.detect(image1, image1KeyPoint);
detector.detect(image2, image2KeyPoint);


//把特征点画在两幅新图上
Mat imageOutput1;
Mat imageOutput2;


drawKeypoints(image1, image1KeyPoint, imageOutput1, Scalar(0, 255, 0));
drawKeypoints(image2, image2KeyPoint, imageOutput2, Scalar(0, 255, 0));


//Sift特征描述提取
SiftDescriptorExtractor extractor;
Mat descriptor1, descriptor2;
//得到Sift特征描述符
extractor.compute(imageOutput1, image1KeyPoint, descriptor1);
extractor.compute(imageOutput2, image2KeyPoint, descriptor2);


//暴力匹配
BruteForceMatcher<L2<float>> matcher;
vector<DMatch> matches;
matcher.match(descriptor1, descriptor2, matches);


//挑选匹配的最好的前20个
nth_element(matches.begin(), matches.begin() + 19, matches.end());
matches.erase(matches.begin() + 19, matches.end());






//画出匹配线
Mat image_matched;




drawMatches(image3, image1KeyPoint, image4, image2KeyPoint, matches, image_matched, Scalar::all(-1), Scalar::all(-1), vector<char>(),2);


imshow("image1", imageOutput1);
imshow("image2", imageOutput2);
imshow("image_matched", image_matched);
imwrite("result.bmp", image_matched);
waitKey(0);
return 0;
}
### 回答1: SIFT是一种计算机视觉算法,用于检测和描述图像中的局部特征。OpenCV是一个流行的计算机视觉库,它提供了SIFT算法的实现。SIFT特征匹配可以用于图像配准、目标跟踪、图像分类等应用。在Python中,可以使用OpenCV库中的sift函数来提取SIFT特征,并使用match函数进行特征匹配。 ### 回答2: SIFT(尺度不变特征变换)是一种在计算机视觉领域中常用的特征提取算法,常用于特征匹配、图像拼接、物体识别等领域。 Python中的OpenCV库提供了SIFT特征提取和匹配的功能,可以通过安装opencv-python库来使用。在进行SIFT特征匹配之前,需要先进行特征提取,SIFT特征提取过程如下: 1. 对于输入的图像,通过高斯滤波进行降噪处理。 2. 对每个像素点进行尺度空间的高斯差分计算,得到关键点。 3. 对每个关键点进行尺度空间的方向计算,得到特征方向。 4. 以关键点为中心生成尺度不变的特征描述子。 接着,在进行SIFT特征匹配时,可以通过计算两张图像的特征描述子之间的欧氏距离,来判断两张图像的相似性。匹配过程如下: 1. 提取两张图像中的SIFT特征点。 2. 对于每个特征点,计算其特征描述子。 3. 计算特征点之间的欧氏距离,得到匹配点对。 4. 通过筛选匹配点对,得到最终的匹配结果。 需要注意的是,在进行特征匹配时,有可能会出现误匹配的情况,因此需要采用一些方法进行筛选,例如RANSAC算法。 总之,通过Python和OpenCV库提供的SIFT特征提取和匹配功能,可以有效地进行图像处理和特征匹配。 ### 回答3: SIFT(Scale-Invariant Feature Transform)是一种计算机视觉中的特征提取算法,该算法可以检测图像中的关键点,并生成描述这些关键点的SIFT特征向量。SIFT特征向量是不受图像缩放、旋转和平移等操作的影响,因此非常适用于实现图像匹配和对象识别。 Python是一种流行的编程语言,在计算机视觉领域,Python结合OpenCV一起使用,可以实现SIFT特征匹配OpenCV是一个开源的计算机视觉库,同时也是一种基于C/C++的跨平台编程库,具有丰富的计算机视觉功能。 在Python中使用OpenCVSIFT算法实现特征匹配的过程大致如下: 1.导入需要的Python库,如numpy和opencv-python等。 2.加载待处理图像并转换成灰度图像。 3.使用SIFT算法提取原图像和目标图像的特征向量。 4.使用Brute-Force匹配算法对两幅图像的特征向量进行匹配。 5.通过比较特征向量的距离判断是否为匹配点,同时根据特定的匹配策略选取最佳匹配点。 6.绘制匹配结果。 需要注意的是,SIFT算法和Brute-Force匹配算法需要先安装OpenCV-python并导入,安装方法如下: pip install opencv-python pip install opencv-contrib-python 以上是Python和OpenCV通过SIFT特征匹配实现的基本步骤,具体实现还需要根据具体的问题进行调整和优化,例如调整特征点的数量、匹配算法的参数和策略等。总的来说,通过Python和OpenCV库的便捷性和丰富性,我们可以在计算机视觉领域中更加灵活地进行图像处理和特征匹配
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值