RANSAC算法原理与实现

article/2025/9/12 17:53:04

参考原文: RANSAC算法学习笔记
重点内容:

算法流程:

1、在可以有(也可以没有,主要看应用场景)条件限制(比如选的子集里的点不能过远等)的情况下,随机选取子集,并假设为局内点。子集的大小,主要取决于要拟合模型的复杂度。
2、用局内点拟合一个模型,此模型适应于假设的局内点,所有的未知参数都能从假设的局内点计算得出。
3、 用2中得到的模型去测试整个数据中其他数据,如果某个点适用于估计的模型,认为它也是局内点,将局内点扩充。
4、如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。
5、用所有扩充后的局内点去重新估计模型。
6、通过估计局内点与模型的错误率来评估模型。
7、如果当前模型效果比最好模型更好而被选用为最好模型,否则抛弃当前模型。至此完成一个迭代,然后从第1步开始一个新的迭代。

算法对比:

在这里插入图片描述

#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/features2d/features2d.hpp>
void extracte_orb(cv::Mat input,std::vector<cv::KeyPoint> &keypoint,cv::Mat &descriptor){cv::Ptr<cv::ORB> f2d = cv::ORB::create(500);f2d->detect(input,keypoint);cv::Mat image_with_kp;f2d->compute(input,keypoint,descriptor);cv::drawKeypoints(input, keypoint, image_with_kp, cv::Scalar::all(-1),cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);cv::imwrite("orb"+std::to_string(random())+".png",image_with_kp);
}void match_two_image(cv::Mat image1,cv::Mat image2, std::vector<cv::KeyPoint> keypoint1,std::vector<cv::KeyPoint> keypoint2,cv::Mat descriptor1,cv::Mat descriptor2){cv::BFMatcher matcher(cv::NORM_HAMMING);std::vector<cv::DMatch> matches;matcher.match(descriptor1,descriptor2, matches);cv::Mat good_matches_image;cv::drawMatches(image1, keypoint1, image2, keypoint2,matches, good_matches_image, cv::Scalar::all(-1), cv::Scalar::all(-1),std::vector<char>(), cv::DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);cv::imwrite("good_matches_image.png",good_matches_image);{std::vector <cv::KeyPoint> RAN_KP1, RAN_KP2;std::vector<cv::Point2f> keypoints1, keypoints2;for (int i = 0; i < matches.size(); i++) {keypoints1.push_back(keypoint1[matches[i].queryIdx].pt);keypoints2.push_back(keypoint2[matches[i].trainIdx].pt);RAN_KP1.push_back(keypoint1[matches[i].queryIdx]);RAN_KP2.push_back(keypoint2[matches[i].trainIdx]);}std::vector<uchar> RansacStatus;cv::findFundamentalMat(keypoints1, keypoints2, RansacStatus, cv::FM_RANSAC);std::vector <cv::KeyPoint> ransac_keypoints1, ransac_keypoints2;std::vector <cv::DMatch> ransac_matches;int index = 0;for (size_t i = 0; i < matches.size(); i++){if (RansacStatus[i] != 0){ransac_keypoints1.push_back(RAN_KP1[i]);ransac_keypoints2.push_back(RAN_KP2[i]);matches[i].queryIdx = index;matches[i].trainIdx = index;ransac_matches.push_back(matches[i]);index++;}}cv::Mat after_ransac_sift_match;cv::drawMatches(image1, ransac_keypoints1, image2, ransac_keypoints2,ransac_matches, after_ransac_sift_match, cv::Scalar::all(-1), cv::Scalar::all(-1),std::vector<char>(), cv::DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);cv::imwrite("after_ransac_orb_match.png",after_ransac_sift_match);}
}int main(int argc, char *argv[])
{cv::Mat image1 = cv::imread(argv[1]);cv::Mat image2 = cv::imread(argv[2]);std::vector<cv::KeyPoint> keypoint1,keypoint2;cv::Mat descriptor1, descriptor2;extracte_orb(image1,keypoint1,descriptor1);extracte_orb(image2,keypoint2,descriptor2);match_two_image(image1,image2,keypoint1,keypoint2,descriptor1,descriptor2);return 0;
}

总结

从上面的结果来看,经过ransac后的效果还会很好的,剔除了很多错误的匹配结果。

RANSAC的优点是它能鲁棒的估计模型参数。例如,它能从包含大量局外点的数据集中估计出较高精度的参数,较少了离群点对模型结果的影响。

RANSAC的缺点是它计算参数的迭代次数没有上限;如果设置迭代次数的上限,得到的结果可能不是最优的结果,甚至可能得到错误的结果。RANSAC只有一定的概率得到可信的模型,概率与迭代次数成正比。RANSAC的另一个缺点是它要求设置跟问题相关的阀值。RANSAC只能从特定的数据集中估计出一个模型,如果存在两个(或多个)模型,RANSAC不能找到别的模型。

虽然缺点不少,但是我还是不能失去他。


http://chatgpt.dhexx.cn/article/9IE6pytI.shtml

相关文章

深度解析RANSAC算法(精华修正版)

RANSAC算法看似简单&#xff0c;实际上还是有很多坑的&#xff0c;网上有一些关于RANSAC算法的介绍不准确&#xff0c;或者说不全面。 之前我写过一个rnsac算法简介的博客&#xff0c;那么这篇博客将带你再次填这个大坑&#xff01; 目录 1. RANSAC算法论述 2. RANSAC算法…

利用RANSAC算法筛选SIFT特征匹配

关于RANSAC算法的基本思想&#xff0c;可从网上搜索找到&#xff0c;这里只是RANSAC用于SIFT特征匹配筛选时的一些说明。 RANSAC算法在SIFT特征筛选中的主要流程是&#xff1a; (1) 从样本集中随机抽选一个RANSAC样本&#xff0c;即4个匹配点对 (2) 根据这4个匹配点对计算变…

Ransac算法学习python版

初学小白,注释的代码比较详细 import numpy as np import scipy as sp import scipy.linalg as sldef ransac(data, model, n, k, t, d, debug False, return_all False):"""参考:http://scipy.github.io/old-wiki/pages/Cookbook/RANSAC伪代码:http://en.wi…

RANSAC算法实现 + 直线拟合

一、RANSAC算法 1.参考资料 [1]题目来源与解析&#xff1a;商汤科技SLAM算法岗的RANSAC编程题 [2]牛客网题目&#xff1a;[编程题]线性回归 [3]牛客网解答参考&#xff1a;商汤科技某算法岗的编程题有点过分了啊 [4]RANSAC算法原理&#xff1a;RANSAC翻译、经典RANSAC以及…

精匹配——Opencv实现RANSAC算法进行误匹配对剔除,并和最小二乘法对比

精匹配——RANSAC算法思想及优缺点 目录 精匹配——RANSAC算法思想及优缺点前言一、RANSAC简介二、RANSAC基本思想1.步骤2.迭代次数的公式3.举例&#xff08;拟合直线&#xff0c;拟合最佳单应性矩阵&#xff09; 三、最小二乘法1、最小二乘法的主要思想2、最小二乘解3、仿射变…

ransca算法详细介绍

1、算法概述&#xff1a; RANSAC算法的基本假设是样本中包含正确数据(inliers&#xff0c;可以被模型描述的数据)&#xff0c;也包含异常数据(outliers&#xff0c;偏离正常范围很远、无法适应数学模型的数据)&#xff0c;即数据集中含有噪声。这些异常数据可能是由于错误的测…

RANSAC 特征匹配算法解析

一、RANSAC特征匹配算法简介   RANSAC算法是RANdom SAmple Consensus的缩写&#xff0c;意为随机抽样一致。表面上的意思就是从匹配样本中随机取样&#xff0c;寻找一致的样本点。RANSAC算法是根据一组包含异常数据的样本数据集&#xff0c;计算出数据的数学模型参数&#x…

RANSAC算法(原理及代码实现+迭代次数参数自适应)

RANSAC算法 前言算法流程Python代码RANSAC算法迭代参数的自适应 前言 随机样本一致性 (RANSAC) 是一种迭代方法&#xff0c;用于从一组包含异常值的观察数据中估计数学模型的参数&#xff0c;此时异常值不会对估计值产生影响。简言之&#xff0c;RANSAC是一种滤除异常值的常用算…

RANSAC算法简介

文章目录 1 算法简介2 基本思想3 参数4 应用案例&#xff08;直线拟合&#xff09; 1 算法简介 RANSAC算法的基本假设是样本中包含正确数据(inliers&#xff0c;可以被模型描述的数据)&#xff0c;也包含异常数据(outlies&#xff0c;偏离正常范围很远、无法适应数学模型的数据…

关于RANSAC的理解

先说最小二乘。 ok&#xff0c;你手头有一堆数据&#xff0c;比如这些蓝点&#xff1a; 那么我们假设它符合一个直线模型&#xff1a;yaxb&#xff0c;用最小二乘就可以很容易求解出未知参数a和b。最小二乘大法确实好哇&#xff0c;毕竟高斯用它来估计谷神星的轨道&#xff08…

RANSAC基本原理

计算机视觉基本原理——RANSAC 1. RANSAC简介2. 基本思想3. 范例4. 迭代次数推导 Reference&#xff1a; 1.计算机视觉基本原理——RANSAC 1. RANSAC简介 RANSAC(RAndom SAmple Consensus,随机采样一致)算法是从一组含有“外点”(outliers)的数据中正确估计数学模型参数的迭代…

RANSAC算法的理解与使用

随机抽样一致算法(random sample consensus, RANSAC)&#xff0c;其实就是采用迭代的方法从一组包含离群的被观测数据中估算出数学模型的参数。(比如通过一群点拟合一条直线等) 基本假设 模型假设&#xff1a;事先知道真实数据满足的数学模型&#xff0c;不知道的只是模型的具…

【特征匹配】RANSAC算法原理与源码解析

转载请注明出处&#xff1a;http://blog.csdn.net/luoshixian099/article/details/50217655 勿在浮沙筑高台 随机抽样一致性&#xff08;RANSAC&#xff09;算法&#xff0c;可以在一组包含“外点”的数据集中&#xff0c;采用不断迭代的方法&#xff0c;寻找最优参数模型&…

RANSAC算法详解+Python实现

1.算法描述 RANSAC的基本假设是&#xff1a; &#xff08;1&#xff09;数据由“局内点”组成&#xff0c;例如&#xff1a;数据的分布可以用一些模型参数来解释&#xff1b; &#xff08;2&#xff09;“局外点”是不能适应该模型的数据&#xff1b; &#xff08;3&#xff0…

RANSAC算法与原理(一)

目录 算法介绍举例 算法的基本思想和流程算法的实现流程&#xff1a;迭代次数的推导算法的实现 python代码实现References 算法介绍 首先我们从Random sample consensus - Wikipedia上找到RANSAC原理的介绍。 RANSAC算法的中文名称是随机抽样一致算法(Random Sample Consenus…

RANSAC算法——看完保证你理解

目录 1 最小二乘算法的缺陷2 RANSAC算法2.1 原理2.2 实例2.3 参数 参考感谢阅读 RANSAC全程Random sample consensus&#xff0c;中文即“随机抽样一致算法”&#xff0c;该方法采用迭代的方式从一组包含离群&#xff08;outlier或者错误数据&#xff09;的被观测数据中估算出数…

RANSAC算法介绍

一、RANSAC介绍 随机抽样一致算法&#xff08;RANdom SAmple Consensus,RANSAC&#xff09;,采用迭代的方式从一组包含离群的被观测数据中估算出数学模型的参数。RANSAC算法假设数据中包含正确数据和异常数据&#xff08;或称为噪声&#xff09;。正确数据记为内点&#xff08;…

RANSAC算法讲解

RANSAC是“RANdom SAmple Consensus&#xff08;随机抽样一致&#xff09;”的缩写。它可以从一组包含“局外点”的观测数据集中&#xff0c;通过迭代方式估计数学模型的参数。它是一种不确定的算法——它有一定的概率得出一个合理的结果&#xff1b;为了提高概率必须提高迭代次…

RANSAC介绍(Matlab版直线拟合+平面拟合)

RANSAC介绍&#xff08;Matlab版直线拟合平面拟合&#xff09; 本人邮箱&#xff1a;sylvester0510163.com&#xff0c;欢迎交流讨论&#xff0c; 欢迎转载&#xff0c;转载请注明网址http://blog.csdn.net/u010128736/ 一、RANSAC介绍 随机抽样一致算法&#xff08;RANdom SA…

RANSAC算法(仅供学习使用)

1.定义 RANSAC&#xff08;Random Sample Consensus&#xff09;算法是一种基于随机采样的迭代算法&#xff0c;用于估计一个数学模型参数。它最初由Fischler和Bolles于1981年提出&#xff0c;主要用于计算机视觉和计算机图形学中的模型拟合和参数估计问题。 RANSAC算法的基本…