Opencv实现Surf特征点和Homography匹配物体
另一篇博客已经初步了解单映性的原理和计算,这篇就借助Opencv库来实战。
**目的:**在一张背景图中寻找目标物体,并标注出来。
思路:
- 1.通过
SurfFeatureDetector
分别提取出Object图片和Scene图片各自的特征点(Surf特征点)。- 2.通过
SurfDescriptorExtractor
分别计算出Object图片和Scene图片对特征点的描述。- 3.采用
FlannBasedMatcher
匹配器将Object和Scene各自的特征点匹配起来。(FLANN - Fast Library for Approximate Nearest Neighbors)- 4.提取出一定条件下的Good_Matches,比如小于(3 * 最小匹配距离)的Matches。
- 5.通过
findHomography
函数来计算出Object的特征点(Good_Matches)和Scene的特征点(Good_Matches)之间的单映性矩阵H。- 6.通过
perspectiveTransform
(对二维或者三维矢量进行透射变换,也就是对输入二维坐标点或者三维坐标点进行投射变换)函数对Object图像的四个交点进行投影映射到Scene图像上,并且用线段标识出来。
源码如下:
1 |
|
效果图:
这里也同时贴出计算出来的H(Homography矩阵):
贴出Opencv中Homography相关的函数Api及功能:
- 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
- 如何计算3个二维点对之间的仿射变换矩阵?
使用getAffineTransform()。- 如何计算多个二维点对之间的仿射变换矩阵(使用误差最小准则 )?
使用estimateRigidTransform()或者findHomography。- 如何计算4个二维点对之间的透射变换?
使用getPerspectiveTransform()。- 如何计算多个三维点对之间的仿射变换?
使用estimateAffine3D。- 如何对输入图像进行仿射变换?
使用warpAffine()。- 如何对输入图像进行透射变换?
使用perspectiveTransform()。- 如何对输入的二维点对进行仿射变换?
使用transform()。- 如何对输入的三维点对进行投射变换?
使用perspectiveTransform()。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!