OpenCV 点集匹配 ransac

本文是转载 + 自己心得 , 参考文献后面写

  • estimateRigidTransform():计算多个二维点对或者图像之间的最优仿射变换矩阵 (2行x3列),H可以是部分自由度,比如各向一致的切变。
  • getAffineTransform():计算3个二维点对之间的仿射变换矩阵H(2行x3列),自由度为6.
  • warpAffine():对输入图像进行仿射变换
  • findHomography: 计算多个二维点对之间的最优单映射变换矩阵 H(3行x3列) ,使用最小均方误差或者RANSAC方法 。
  • getPerspectiveTransform():计算4个二维点对之间的透射变换矩阵 H(3行x3列)
  • warpPerspective(): 对输入图像进行透射变换
  • perspectiveTransform():对二维或者三维矢量进行透射变换,也就是对输入二维坐标点或者三维坐标点进行投射变换。
  • estimateAffine3D:计算多个三维点对之间的最优三维仿射变换矩阵H (3行x4列)
  • transform():对输入的N维矢量进行变换,可用于进行仿射变换、图像色彩变换.
  • findFundamentalMat:计算多个点对之间的基矩阵H。

快速解决:

  • 问题1:如何计算3个二维点对之间的仿射变换矩阵?

答:使用getAffineTransform()。

  • 问题2:如何计算多个二维点对之间的仿射变换矩阵(使用误差最小准则 )?

答:使用estimateRigidTransform()或者findHomography。

  • 问题3:如何计算4个二维点对之间的透射变换?

答:使用getPerspectiveTransform()。

  • 问题4:如何计算多个三维点对之间的仿射变换?

答:使用estimateAffine3D。

  • 问题5:如何对输入图像进行仿射变换?

答:使用warpAffine()。

  • 问题6:如何对输入图像进行透射变换?

答:使用perspectiveTransform()。

  • 问题7:如何对输入的二维点对进行仿射变换?

答:使用transform()。

  • 问题8:如何对输入的三维点对进行投射变换?

答:使用perspectiveTransform()。

个人理解:

1.最优单映射变换、透视变换、单应性变换好像是一个东西,英文大概是homography/perspective?  起码他们都用 findHomography 方法

2.我现在遇到的问题是  点集A有多个点,点集B也是多个点,想求用ransac  A映射到B的情况,(我既要ransac  也要仿射变换)

如果用 findHomography 这个方法,他有ransac支持,但是相当于升级成透视变换,仿射变换是透视变换的子集。(有ransac,但是模型仿射变换高)

如果用 estimateRigidTransform 这个方法, 貌似它是用最小平方误差,达不到我要的效果。(没有ransac,模型是仿射变换)

解决方案:

1.直接用 findHomography  反正他是当透视变换处理的,是仿射变换的父集。(省事)

2.调用openCV C++底层库 , 自己写个带ransac的仿射变换。(要求编程)

3.直接顶层重新造轮子,也不麻烦。(要求数学)

我用了第一种。如果有问题,请大家留言讨论,我对计算机视觉仅仅是刚入门,还很多地方不懂。

引用:

http://blog.csdn.net/godenlove007/article/details/9364971

http://stackoverflow.com/questions/11237948/findhomography-getperspectivetransform-getaffinetransform

http://docs.opencv.org/modules/video/doc/motion_analysis_and_object_tracking.html#estimaterigidtransform

时间: 2024-08-27 16:11:38

OpenCV 点集匹配 ransac的相关文章

【Python】opencv商标匹配并转跳到百度百科

安装 下载并安装opencv for windows 安装selenium:pip install selenium 测试用图片 代码 find_obj.py #!/usr/bin/env python ''' Feature-based image matching sample. USAGE find_obj.py [--feature=<sift|surf|orb>[-flann]] [ <image1> <image2> ] --feature - Featur

opencv 模板匹配,在图像中寻找物体

使用模板匹配在图像中寻找物体 模板匹配 模板匹配就是用来在大图中找小图,也就是说在一副图像中寻找另外一张模板图像的位置: opencv中用 cv.matchTemplate() 实现模板匹配. 模板匹配的原理其实很简单,就是不断地在原图中移动模板图像去比较,有6种不同的比较方法,详情可参考:TemplateMatchModes 1. 平方差匹配CV_TM_SQDIFF:用两者的平方差来匹配,最好的匹配值为0 2. 归一化平方差匹配CV_TM_SQDIFF_NORMED 3. 相关匹配CV_TM_

opencv模板匹配查找图像(python)

#!/usr/bin/env python3 # -*- coding: utf-8 -*- import cv2 import numpy as np from cv2 import COLOR_BGR2GRAY def main(): # 读取原图 img_rgb = cv2.imread("d:/img-src.png") # 转为灰度图 img_gray = cv2.cvtColor(img_rgb, COLOR_BGR2GRAY) # 读取模版图 template = cv2

集合DP 点集匹配问题

刘汝佳大白书p61页 #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <iostream> using namespace std; #define INF 0x3f3f3f3f #define N 21 struct point { double x, y, z; } P[N]; double x[N], y[N]; doub

openCV中的findHomography函数分析以及RANSAC算法的详解

本文将openCV中的RANSAC代码全部挑选出来,进行分析和讲解,以便大家更好的理解RANSAC算法.代码我都试过,可以直接运行. 在计算机视觉和图像处理等很多领域,都需要用到RANSAC算法.openCV中也有封装好的RANSAC算法,以便于人们使用.关于RANSAC算法的一些应用,可以看我的另一篇博客: 利用SIFT和RANSAC算法(openCV框架)实现物体的检测与定位,并求出变换矩阵(findFundamentalMat和findHomography的比较) 但是前几天师弟在使用op

史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门

一.Python OpenCV 入门 欢迎阅读系列教程,内容涵盖 OpenCV,它是一个图像和视频处理库,包含 C ++,C,Python 和 Java 的绑定. OpenCV 用于各种图像和视频分析,如面部识别和检测,车牌阅读,照片编辑,高级机器人视觉,光学字符识别等等. 你将需要两个主要的库,第三个可选:python-OpenCV,Numpy 和 Matplotlib. Windows 用户: python-OpenCV:有其他的方法,但这是最简单的. 下载相应的 wheel(.whl)文件

基于RANSAC的点云面分割算法

该算法在RANSAC和空间检索树的基础上实现的. 算法思路: 1.点云抽希.法线估计 2.出局点索引存储声明 3.平面检测 for (size_t i = 0; i < cloudTemp->points.size(); i++) { 判断为出局点: if (检索一定量的临近点) { 判断搜索点集是否符合要求: 存储搜索的点集 : } RANSAC平面拟合(ransac计算平面模型参数): 判断平面拟合的正确性: /* * 利用拟合平面 计算点云到该面距离, 设置容差  判断点云是否在平面内

02-11 RANSAC算法线性回归(波斯顿房价预测)

目录 RANSAC算法线性回归(波斯顿房价预测) 一.RANSAC算法流程 二.导入模块 三.获取数据 四.训练模型 五.可视化 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/ RANSAC算法线性回归(波斯顿房价预测) 虽然普通线性回归预测结果总体而言还是挺不错的,但是从数据上可以看出数据集中有较多的离群值,因此本节将使用RANSAC算法针对离群值做处理,即根据数据

仿射变换详解 warpAffine

今天遇到一个问题是关于仿射变换的,但是由于没有将仿射变换的具体原理型明白,看别人的代码看的很费解,最后终于在师兄的帮助下将原理弄明白了,我觉得最重要的是理解仿射变换可以看成是几种简单变换的复合实现, 具体实现形式即将几种简单变换的变换矩阵M相乘,这样就很容易理解啦 定义:仿射变换的功能是从二维坐标到二维坐标之间的线性变换,且保持二维图形的"平直性"和"平行性".仿射变换可以通过一系列的原子变换的复合来实现,包括平移,缩放,翻转,旋转和剪切. 这类变换可以用一个3*3