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如何实现PDF隐私信息检测

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

使用Python在Excel中插入、修改、提取和删除超链接

《使用Python在Excel中插入、修改、提取和删除超链接》超链接是Excel中的常用功能,通过点击超链接可以快速跳转到外部网站、本地文件或工作表中的特定单元格,有效提升数据访问的效率和用户体验,这... 目录引言使用工具python在Excel中插入超链接Python修改Excel中的超链接Python

C#从XmlDocument提取完整字符串的方法

《C#从XmlDocument提取完整字符串的方法》文章介绍了两种生成格式化XML字符串的方法,方法一使用`XmlDocument`的`OuterXml`属性,但输出的XML字符串不带格式,可读性差,... 方法1:通过XMLDocument的OuterXml属性,见XmlDocument类该方法获得的xm

C#提取PDF表单数据的实现流程

《C#提取PDF表单数据的实现流程》PDF表单是一种常见的数据收集工具,广泛应用于调查问卷、业务合同等场景,凭借出色的跨平台兼容性和标准化特点,PDF表单在各行各业中得到了广泛应用,本文将探讨如何使用... 目录引言使用工具C# 提取多个PDF表单域的数据C# 提取特定PDF表单域的数据引言PDF表单是一

C#实现添加/替换/提取或删除Excel中的图片

《C#实现添加/替换/提取或删除Excel中的图片》在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观,下面我们来看看如何在C#中实现添加/替换/提取或删除E... 在Excandroidel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java后端接口中提取请求头中的Cookie和Token的方法

《Java后端接口中提取请求头中的Cookie和Token的方法》在现代Web开发中,HTTP请求头(Header)是客户端与服务器之间传递信息的重要方式之一,本文将详细介绍如何在Java后端(以Sp... 目录引言1. 背景1.1 什么是 HTTP 请求头?1.2 为什么需要提取请求头?2. 使用 Spr

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量