OpenCV之sift图像匹配

OpenCV提供的视觉处理算法非常丰富,并且她部分以C语言编写,加上其开源的特性,处理得当,不需要添加新的外部支持也可以完整的编译连接生成执行程序。

SIFT算法的特点有:

1. SIFT特征是图像的局部特征,其对旋转、尺度缩放、亮度变化保持不变性,对视角变化、仿射变换、噪声也保持一定程度的稳定性;

2. 独特性(Distinctiveness)好,信息量丰富,适用于在海量特征数据库中进行快速、准确的匹配;

3. 多量性,即使少数的几个物体也可以产生大量的SIFT特征向量;

4. 高速性,经优化的SIFT匹配算法甚至可以达到实时的要求;

5. 可扩展性,可以很方便的与其他形式的特征向量进行联合。

       BF算法:

       即暴风(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。

#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
#include <opencv2/nonfree/features2d.hpp> 
#include <iostream>  
using namespace cv;  
using namespace std;  
   
int main(int argc, const char *argv[]){  
    Mat I1 = imread("添加图片地址", 0);// 载入灰度图像 ,0表示灰度图像
    Mat I2 = imread("添加图片地址", 0);  
  
    SiftFeatureDetector detector;     //sift特征提取
    vector<KeyPoint> keypoints1, keypoints2;  // 定义关键点
    detector.detect(car1, keypoints1);     //检测关键点
    detector.detect(car2, keypoints2);  
    cout << "# keypoints of I1 :" << keypoints1.size() << endl;    //输出关键点的数量
    cout << "# keypoints of I2 :" << keypoints2.size() << endl;  
     
    Mat descriptors1,descriptors2;                                   //定义描述符
    Ptr<DescriptorExtractor> extractor = DescriptorExtractor::create("SIFT");  //描述符提取
    extractor->compute(I1,keypoints1,descriptors1);  
    extractor->compute(I2,keypoints2,descriptors2);     //提取关键点的和描述关键点
      
    BFMatcher bfmatcher(NORM_L2, true);                       // 暴风匹配
    vector<DMatch> matches;  
    bfmatcher.match(descriptors1, descriptors2, matches);  
    cout << "# matches : " << matches.size() << endl;  
  
  
    // 显示图像  
    Mat output;  
    drawMatches(I1, keypoints1, I2, keypoints2, matches, output);   //对两幅图上的关键点进行连线
    imshow("匹配结果",output);  
    imshow("载入原始图像地址",I1);
    imshow("载入原始图像地址",I2);
    waitKey(0);  
    return 0;  
}  

实验结果:


参考:

关键点描述子匹配

Common Interfaces of Descriptor Matchers

SIFT原理与源码分析


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值