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

相关文章

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

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

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

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

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤

Python实现常用文本内容提取

《Python实现常用文本内容提取》在日常工作和学习中,我们经常需要从PDF、Word文档中提取文本,本文将介绍如何使用Python编写一个文本内容提取工具,有需要的小伙伴可以参考下... 目录一、引言二、文本内容提取的原理三、文本内容提取的设计四、文本内容提取的实现五、完整代码示例一、引言在日常工作和学

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

详解如何使用Python提取视频文件中的音频

《详解如何使用Python提取视频文件中的音频》在多媒体处理中,有时我们需要从视频文件中提取音频,本文为大家整理了几种使用Python编程语言提取视频文件中的音频的方法,大家可以根据需要进行选择... 目录引言代码部分方法扩展引言在多媒体处理中,有时我们需要从视频文件中提取音频,以便进一步处理或分析。本文

基于Python实现一个PDF特殊字体提取工具

《基于Python实现一个PDF特殊字体提取工具》在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的PDF特殊字体提取器是一款基于Python开发的桌面应用程序感兴趣的... 目录一、应用背景与功能概述二、技术架构与核心组件2.1 技术选型2.2 系统架构三、核心功能实现解析

Linux使用cut进行文本提取的操作方法

《Linux使用cut进行文本提取的操作方法》Linux中的cut命令是一个命令行实用程序,用于从文件或标准输入中提取文本行的部分,本文给大家介绍了Linux使用cut进行文本提取的操作方法,文中有详... 目录简介基础语法常用选项范围选择示例用法-f:字段选择-d:分隔符-c:字符选择-b:字节选择--c

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形