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


posted @ 2015-05-16 08:33  ruiruige1991  阅读(3194)  评论(0编辑  收藏  举报