参考原文: 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不能找到别的模型。

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

RANSAC算法原理与实现相关推荐

  1. RANSAC算法原理与应用(1)

    文章目录 前言 案例(直线RANSAC) RANSAC 抽样次数 距离阈值 终止阈值 最终估计 参考文献 前言 随机采样一致性(random sample consensus,RANSAC)是一种对带 ...

  2. RANSAC算法注记

    今天学习了一下RANSAC随机样本一致性算法,其在图像融合.特征点匹配方面有很强大的应用.网上已经有很多人写了关于这方面的文档,就不再造轮子了.特此罗列出来,以供后续参考. 我的数学之美(一)--RA ...

  3. 自适应采样次数的Ransac算法

    自适应采样次数的Ransac算法 Ransac基本思想 自适应采样次数的Ransac算法原理 对数据进行拟合操作的同学肯定对Ransac算法不陌生,之前接触过一段时间,最近有空才把这么经典的一个算法分 ...

  4. 改进的RANSAC算法实现点云粗配准

    目录 前言 一.RANSAC算法原理 参考文献 二.代码示例 1.计算FPFH特征描述子 2.RANSAC算法

  5. RANSAC算法实现 + 直线拟合

    一.RANSAC算法 1.参考资料 [1]题目来源与解析:商汤科技SLAM算法岗的RANSAC编程题 [2]牛客网题目:[编程题]线性回归 [3]牛客网解答参考:商汤科技某算法岗的编程题有点过分了啊 ...

  6. 把计算机视觉算法应用遥感,RANSAC算法及其在遥感图像处理中的应用

    摘要: 在计算机视觉,工程设计等领域都需要根据相关数据集确定模型参数,但是所得到的数据中往往存在大量不符合模型的异常数据(又被称为野点),这些野点对模型参数稳健性有很大的干扰.经典的参数估计算法如最小 ...

  7. RANSAC(随机采样一致算法)原理及openCV代码实现

    <RANSAC(随机采样一致算法)原理及openCV代码实现> 原文: http://www.lai18.com/content/1046939.html  本文转自:http://b ...

  8. RANSAC算法(2):(拟合平面)本文以地面为基础以及源码分布解读

    本章代码是本人根据一个未曾谋面的好人学习的(要怀抱希望,世界上好人真的是很多的,我要做一个去给别人带去正能量积极态度的人,加油喽),如需转载学习请注明.谢谢 ---------------基于rans ...

  9. RANSAC算法做直线拟合

    RANSAC算法之前了解过相关的原理,这两天利用晚上闲暇的时间,看了一下RANSAC算法的Python代码实现,这方面的资料很多了,这里就不在重复.在分析该RANSAC.py代码之前,想用自己的对RA ...

最新文章

  1. Retrofit2.0
  2. 千米感知误差低于5%,嬴彻发布全球领先的超长距精准3D感知技术
  3. fs:[124]对应CurrentThread
  4. WebService大讲堂之Axis2(5):会话(Session)管理
  5. 【青铜打铁篇】Activiti 工作流从入门到入土?
  6. Zabbix 最新版 5.2 版本源码安装
  7. MyBatis映射文件1(增删改、insert获取自增主键值)
  8. 面向科研的推荐系统Benchmark诞生!
  9. Lightroom Classic 教程,如何在 Lightroom 中使用引导式修复透视图?
  10. linux 创建软连接_linux删除原理
  11. 大津阈值分割(OSTU)
  12. Redis中的事务和三特性
  13. 如何使用IP访问阿里云服务器
  14. 炼丹笔记三:数据增强
  15. 短视频三要素之封面,如何设计引人关注的封面呢?
  16. 【NOIP2017】跳房子
  17. Python-高级:多任务-协程 案例:图片下载器
  18. dom4j实现XML操作
  19. React中三元运算符的坑
  20. vue-购物车基本代码

热门文章

  1. 索引与优化like查询
  2. mysql主从状态异常解决办法
  3. find——文件查找命令 linux一些常用命令
  4. 新疆电信IBSS系统集中联机热备份--案例
  5. Android 数字签名学习笔记
  6. matlab生成wav文件并用python验证
  7. SpringBoot启动类的扫描注解的用法及冲突原则
  8. jquery获取select选中的值
  9. left4dead2 常用配置
  10. js颜色选择器 制作分析