OpenCV(四十七):RANSAC优化特征点匹配

2023-09-16 12:57:28

1.RANSAC算法介绍

 RANSAC是一种常用的参数估计方法,全称为Random Sample Consensus(随机抽样一致性)。它的主要思想是通过随机选择一部分数据样本,构建模型并评估其拟合程度,迭代过程中逐步优化模型,最终得到一个拟合较好的模型。

其基本流程如下:

  • 随机取样,计算规律(特征点匹配中计算单应矩阵)
  • 测试规律是否满足大多数数据
  • 循环前两步
  • 选取最佳规律,并输出满足数据的点

2.RANSAC优化特征点匹配结果的函数findHomography()

Mat cv::findHomography ( InputArray srcPoints,

InputArray       dstPoints,

int            method = 0,

double     ransacReprojThreshold =3,

OutputArray mask = noArray(),

const intmaxlters = 2000,

const double confidence = 0.995

  • SrcPoints:原始图像中特征点的坐标
  • dstPoints:目标图像中特征点的坐标
  • method:计算单应矩阵方法的标志
  • ransacReprojThreshold; 重投影的最大误差
  • mask:掩码矩阵,使用RANSAC算法时表示满足单应矩阵的特征点
  • maxIters:RANSAC算法迭代的最大次数
  • confidence:置信区间,取值范围0-1

3.示例代码

void orb_fearures(Mat &gray,vector<KeyPoint> &keypoints,Mat &descriptions){
    Ptr<ORB> orb=ORB::create(1000,1.2f);
    orb->detect(gray,keypoints);
    orb->compute(gray,keypoints,descriptions);
}
//RANSAC算法实现
void ransac(vector<DMatch> matches,vector<KeyPoint> queryKeyPoint,vector<KeyPoint> trainKeyPoint,vector<DMatch> &matches_ransac){
    //定义保存匹配点对坐标
    vector<Point2f> srcPoints(matches.size()),dstPoints(matches.size());
    //保存从关键点中提取到的匹配点对坐标
    for(int i=0;i<matches.size();i++){
        srcPoints[i]=queryKeyPoint[matches[i].queryIdx].pt;
        dstPoints[i]=trainKeyPoint[matches[i].trainIdx].pt;
    }
    //匹配点对进行RANSAC过滤
    vector<int> inliersMask(srcPoints.size());
    findHomography(srcPoints,dstPoints,RANSAC,5,inliersMask);
    //手动的保留RANSAC过滤的匹配点对
    for(int i=0;i<inliersMask.size();i++){
        if(inliersMask[i]){
            matches_ransac.push_back(matches[i]);
        }
    }
}

void Ransac_f(Mat img1,Mat img2){
    //提取特征点
    vector<KeyPoint> keypoints1,keypoints2;
    Mat descriptions1,descriptions2;
    //计算特征点
    orb_fearures(img1,keypoints1,descriptions1);
    orb_fearures(img2,keypoints2,descriptions2);
    //特征点匹配
    vector<DMatch> matches;//定义存放匹配结果的变量
    BFMatcher matcher(NORM_HAMMING);//定义特征点匹配的类,使用汉明距离
    matcher.match(descriptions1,descriptions2,matches);//进行特征点匹配
    ostringstream ss;
    ss<<"matches="<<matches.size()<<endl;//匹配成功特征点数目
    //通过汉明距离删选匹配结果
    double min_dist=1000,max_dist=0;
    for(int i=0;i<matches.size();i++){
        double dist=matches[i].distance;
        if(dist<min_dist) min_dist=dist;
        if(dist>max_dist) max_dist=dist;
    }
    //输出所有匹配结果中最大韩明距离和最小汉明距离
    ss<<"min_dist="<<min_dist<<endl;
    ss<<"max_dist="<<max_dist<<endl;
    //将汉明距离较大的匹配点对删除
    vector<DMatch> good_matches;
    for(int i=0;i<matches.size();i++){
        if(matches[i].distance<=max(2*min_dist,20.0)){
            good_matches.push_back(matches[i]);
        }
    }
    ss<<"good_min="<<good_matches.size()<<endl;//剩余特征点数目
    LOGD("%s",ss.str().c_str());
    //用ransac算法筛选匹配结果
    vector<DMatch> good_ransac;
    ransac(good_matches,keypoints1,keypoints2,good_ransac);
    //绘制匹配结果
    Mat outimg2;
    drawMatches(img1,keypoints1,img2,keypoints2,good_ransac,outimg2);
    //显示结果
    imwrite("/sdcard/DCIM/outimg2.png",outimg2);//ransac筛选

}

ransac筛选结果: 

更多推荐

【二叉搜索树】将二叉搜索树变平衡-力扣 1382 题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。推荐:kuan的首页,持续学习,不断总结,共同进步,活到老学到老导航檀越剑指大厂系列:全面总结java核心技术点,如集合,jvm,并发编程redis,kaf

AG35学习笔记(一):debug串口抓取模组log、debug串口测试AT指令、echo命令通过串口发送16进制数据

目录一、概述二、抓取模组log2.1硬件接口2.2用户登录2.3相关指令三、测试AT指令3.1查看端口3.2进入模式四、串口发16进制echo使用一、概述二、抓取模组log在之前记录了通过USB,使用移远工具Qwinlog来抓取log(3.3抓取模组log)。现在记录下使用debug串口抓取模组log。2.1硬件接口根

MES管理系统在生产中的应用及智能工厂的构建思路

在当今制造业中,随着信息化技术和智能化的不断发展,MES生产管理系统已成为工厂生产的核心组成部分。MES管理系统不仅能够提高生产效率,还可以优化生产流程,提升产品质量。本文将详细介绍MES管理系统在工厂生产中的应用以及构建智能工厂的思路。一、MES系统在工厂生产中的应用1、生产计划管理MES系统在生产计划管理中起到了关

chat-gpt笔记:参数temperature与top_p

temperature官方文档temperaturenumberornullOptionalDefaultsto1Whatsamplingtemperaturetouse,between0and2.Highervalueslike0.8willmaketheoutputmorerandom,whilelowervalu

python中的NaN在质量控制中怎么处理?

一、数据中的缺省值气象数据中经常存在缺省值,比如未入库的站点数据、比如海温格点实况数据中的陆地区域。这些缺省值往往被赋予NaN(NotaNumber,非数)。NaN是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。这些NaN值一般需要在计算时被去除掉,以免影响计算结果。那么,该怎么去除呢?二、NaN的定义和

27 WEB漏洞-XSS跨站之代码及httponly绕过

目录HttpOnly安全过滤测试HttpOnly安全过滤绕过思路演示案例:Xsslabs关卡代码过滤绕过测试HttpOnly安全过滤测试防止xss攻击,指的是攻击手法,并不是能防止XSS漏洞,httponly阻止的仅仅只是cookiehttponly在相关的脚本都是支持的,我们根据自己网站的脚本环境,有相当的开启方法h

【错误记录】Python 中使用 PySpark 数据计算报错 ( SparkException: Python worker failed to connect back. )

文章目录一、报错信息二、问题分析三、解决方案错误原因:没有为PySpark配置Python解释器,将下面的代码卸载Python数据分析代码的最前面即可;#为PySpark配置Python解释器importosos.environ['PYSPARK_PYTHON']="Y:/002_WorkSpace/PycharmPr

【跟小嘉学 Rust 编程】三十一、Rust的日志与追踪

系列文章目录【跟小嘉学Rust编程】一、Rust编程基础【跟小嘉学Rust编程】二、Rust包管理工具使用【跟小嘉学Rust编程】三、Rust的基本程序概念【跟小嘉学Rust编程】四、理解Rust的所有权概念【跟小嘉学Rust编程】五、使用结构体关联结构化数据【跟小嘉学Rust编程】六、枚举和模式匹配【跟小嘉学Rust

肖sir__mysql之存储__012

mysql之存储一、存储1、什么是存储过程定义:存储过程就是实现某个特定功能的sql语句的集合,编译后的存储过程会保存在数据库中,通过存储过程的名称可以反复的调用执行。2、存储过程的优点?(1)存储创建后,可以反复的调用,和使用,不需要重新写复杂的sal语句(2)创建、修改存储过程不会对数据有任何影响(3)存储过程可以

CFCA证书 申请 流程(二)

关于CFCA证书的介绍,可参考上一篇文章:CFCA证书申请流程(一)_身价五毛的博客-CSDN博客CFCA测试证书申请流程测试证书主要用于在测试环境对所需功能进行验证,例如HTTPS访问等。首先,向CFCA的支持邮箱(support@cfca.com.cn)发送邮件,描述申请证书的类型和参数,具体包括:此邮件是自动回复

轻量云服务器租用好在哪

从技术上讲,轻量级云服务器是特化了某一配置的高性价比云服务器的结合。下面,我们将了解轻量级云服务器有什么优势,使用物理服务器搭建网站,您需要租用整个服务器,这成本会变得非常昂贵。这对于一些比较简单的使用需求而言,例如搭建一个单页网站或者一个做个代理的话其实用整台服务器不仅性能溢出而且价格很贵对于初学者来说,使用轻量级云

热文推荐