OpenCV的SIFT特征点提取及RANSAC去除误检测

2024-02-22 20:18

本文主要是介绍OpenCV的SIFT特征点提取及RANSAC去除误检测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于SIFT的讲解,参考:http://blog.csdn.net/zddblog/article/details/7521424
关于SANCAS的讲解,参考:http://blog.csdn.net/laobai1015/article/details/51682596

SIFT(Scale Invariant Feature Transform)多尺度特征点提取算法在nonfree文件内集成。
RANSAC(Random Sample Consensus随机抽样一致算法在calib3d文件内集成。

主要的思路是:
(1)利用SiftFeatureDetector类对象提取SIFT特征点;
(2)利用SiftDescriptorExtractor类对象进行特征点的特征提取;
(3)利用BFMatcher类对象实现初步匹配;
(注意:在第3步中,实际上已经完成SIFT特征点的提取与匹配,但是会有较多的无匹配,因此后面的步骤主要思路是利用RANSAC方法去除误匹配)
(4)利用2-范数特征阈值初步筛选去除误匹配;
(6)利用findFundamentalMat函数实现RANSAC算法。
文件头如下:
  1. #include <opencv2/opencv.hpp>  
  2. #include <iostream>  
  3. #include <opencv2/nonfree/nonfree.hpp>  
  4. #include <opencv2/features2d/features2d.hpp>  
代码如下:
  1. Mat Limg = imread("Limage.png", CV_LOAD_IMAGE_ANYDEPTH);  
  2. Mat Rimg = imread("Rimage.png", CV_LOAD_IMAGE_ANYDEPTH);  
  3. // detecting keypoints  
  4. SiftFeatureDetector detector(0, 3, 0.04, 10, 1.6);  
  5. // (特征点数目-按sift特征质量排序,金字塔中每组的层数,过滤的阈值,边缘效应阈值,高斯滤波系数)  
  6. vector<KeyPoint> Lkeypoints, Rkeypoints;  
  7. detector.detect(Limg, Lkeypoints);  
  8. detector.detect(Rimg, Rkeypoints);  
  9. // computing descriptors  
  10. // SiftDescriptorExtractor extractor;  
  11. SiftDescriptorExtractor extractor;  
  12. Mat Ldescriptors, Rdescriptors;  
  13. extractor.compute(Limg, Lkeypoints, Ldescriptors);  
  14. extractor.compute(Rimg, Rkeypoints, Rdescriptors);  
  15. // matching descriptors  
  16. BFMatcher matcher(NORM_L1);  //> 对应sift  
  17. vector<DMatch> matches;  
  18. matcher.match(Ldescriptors, Rdescriptors, matches);  
  19. //   
  20. namedWindow("matches", CV_WINDOW_FREERATIO);  
  21. Mat img_matches;  
  22. drawMatches(Limg, Lkeypoints, Rimg, Rkeypoints, matches, img_matches);  
  23. imshow("matches", img_matches);  
  24. // coordination of match-feature-point  
  25. vector<Point2f> Lp, Rp;  
  26. for (size_t m = 0; m < matches.size(); m++)  
  27. {  
  28.     int i1 = matches[m].queryIdx;  
  29.     int i2 = matches[m].trainIdx;  
  30.     Mat Ldesc = Ldescriptors.row(i1);  
  31.     Mat Rdesc = Rdescriptors.row(i2);  
  32.     double EuclideanDist = norm(Ldesc, Rdesc);  
  33.     if (EuclideanDist <= 50)  
  34.     {  
  35.         const KeyPoint &kp1 = Lkeypoints[i1], &kp2 = Rkeypoints[i2];  
  36.         Lp.push_back(kp1.pt);  
  37.         Rp.push_back(kp2.pt);  
  38.     }  
  39. }  
  40. // 用RANSAC方法计算基本矩阵&去除误匹配    
  41. Mat Fundamental;  
  42. vector<uchar> RANSACStatus;  
  43. Fundamental = findFundamentalMat(Lp, Rp, RANSACStatus, CV_FM_RANSAC, 3.0, 0.995);  
  44. // 筛选特征点  
  45. vector<Point2f> Lpoint, Rpoint;  
  46. vector<DMatch> m_match;  
  47. int idxnum = 0;  
  48. for (int i = 0; i < RANSACStatus.size(); i++)  
  49. {  
  50.     if (RANSACStatus[i] != 0)  
  51.     {  
  52.         Lpoint.push_back(Lp[i]);  
  53.         Rpoint.push_back(Rp[i]);  
  54.         idxnum++;  
  55.     }  
  56. }     
  57. m_match.resize(idxnum);  
  58. for (int idx = 0; idx < idxnum; idx++)  
  59. {  
  60.     // 用于匹配验证  
  61.     m_match[idx].queryIdx = idx;  
  62.     m_match[idx].trainIdx = idx;  
  63. }  
  64. // 把内点转换为drawMatches可以使用的格式    
  65. vector<KeyPoint> Lkp(idxnum);  
  66. vector<KeyPoint> Rkp(idxnum);  
  67. KeyPoint::convert(Lpoint, Lkp);  
  68. KeyPoint::convert(Rpoint, Rkp);  
  69. // 显示筛选后的特征点  
  70. namedWindow("m_match", CV_WINDOW_FREERATIO);  
  71. Mat m_matches;  
  72. drawMatches(Limg, Lkp, Rimg, Rkp, m_match, m_matches);  
  73. imshow("m_match", m_matches);  
其中,
第20-23行展示的是SIFT特征点经过BFMatch之后的结果,一般来说误匹配较多,效果不理想;
第70-73行展示的是SIFT特征点经过RANSAC之后的结果,一般来说效果好很多。


这篇关于OpenCV的SIFT特征点提取及RANSAC去除误检测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/736386

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

Python实现word文档内容智能提取以及合成

《Python实现word文档内容智能提取以及合成》这篇文章主要为大家详细介绍了如何使用Python实现从10个左右的docx文档中抽取内容,再调整语言风格后生成新的文档,感兴趣的小伙伴可以了解一下... 目录核心思路技术路径实现步骤阶段一:准备工作阶段二:内容提取 (python 脚本)阶段三:语言风格调

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

CSS去除a标签的下划线的几种方法

《CSS去除a标签的下划线的几种方法》本文给大家分享在CSS中,去除a标签(超链接)的下划线的几种方法,本文给大家介绍的非常详细,感兴趣的朋友一起看看吧... 在 css 中,去除a标签(超链接)的下划线主要有以下几种方法:使用text-decoration属性通用选择器设置:使用a标签选择器,将tex

详解C#如何提取PDF文档中的图片

《详解C#如何提取PDF文档中的图片》提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使用,下面我们就来看看如何使用C#通过代码从PDF文档中提取图片吧... 当 PDF 文件中包含有价值的图片,如艺术画作、设计素材、报告图表等,提取图片可以将这些图像资源进行单独保存,方便后续在不同的项目中使

opencv图像处理之指纹验证的实现

《opencv图像处理之指纹验证的实现》本文主要介绍了opencv图像处理之指纹验证的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、简介二、具体案例实现1. 图像显示函数2. 指纹验证函数3. 主函数4、运行结果三、总结一、