点击上方蓝字关注我们

微信公众号:OpenCV学堂

关注获取更多计算机视觉与深度学习知识

单应性矩阵计算函数与应用

OpenCV在通过特征描述子完成描述子匹配之后,会得到一些关键点对,我们会把这些关键点对分别添加到两个vector对象中,作为输入参数,调用单应性矩阵发现函数来发现一个变换矩阵H,函数 findHomography 就完成了这样的功能,常见的调用代码如下:

 1//-- Localize the object 2std::vector obj_pts; 3std::vector scene_pts; 4for (size_t i = 0; i  5{ 6         //-- Get the keypoints from the good matches 7         obj_pts.push_back(keypoints_obj[goodMatches[i].queryIdx].pt); 8         scene_pts.push_back(keypoints_sence[goodMatches[i].trainIdx].pt); 9}10Mat H = findHomography(obj_pts, scene_pts, RHO);

有了变换矩阵H之后,我们就可以根据输入图像四点坐标,从场景图像上得到特征匹配图像的四点坐标,代码实现如下:

1//-- Get the corners from the image_1 ( the object to be "detected" )2std::vector obj_corners(4);3obj_corners[0] = Point(0, 0); obj_corners[1] = Point(box.cols, 0);4obj_corners[2] = Point(box.cols, box.rows); obj_corners[3] = Point(0, box.rows);5std::vector scene_corners(4);6perspectiveTransform(obj_corners, scene_corners, H);

其中scene_corners为对象在场景图像中的四点坐标,获得坐标以后就可以绘制对应的矩形,从而在场景图像中绘制对象的外接矩形区域。运行结果如下:

上述步骤中最重要的就是单应性矩阵H的计算,这里我们首先来看一下该函数与其各个参数解释:

1Mat cv::findHomography       (       2     InputArray      srcPoints,3     InputArray      dstPoints,4     int   method = 0,5     double    ransacReprojThreshold = 3,6     OutputArray   mask = noArray(),7     const int         maxIters = 2000,8     const double  confidence = 0.9959)

参数解释如下:srcPoints:特征点集合,一般是来自目标图像dstPoints:特征点集合,一般是来自场景图像method:表示使用哪种配准方法,支持有四种方法(后续详细说)

  • 0 – 使用所有的点,比如最小二乘

  • RANSAC – 基于随机样本一致性

  • LMEDS – 最小中值

  • RHO –基于渐近样本一致性

ransacReprojThreshold:该参数只有在method参数为RANSAC与RHO的时启用,默认为3mask:遮罩,当method方法为RANSAC 或 LMEDS可用maxIters:最大迭代次数,当使用RANSAC方法confidence:置信参数,默认为0.995

单应性矩阵H发现方法

首先简单的解释一下H的作用,假设在特征匹配或者对齐,视频移动估算中有两张图像image1与image2,image1上有特征点(x1,y1)匹配image2上的特征点(x2,y2),现在我们需要在两者之间建立一种视图变换关系(透视变换),图示如下(图二):

其中H是一个3x3的矩阵

这样为了求出H中的参数,需要两个点对集合,就是findHomography函数中前两个输入参数,理想情况下,通过特征提取得到特征点会再下一帧或者场景图像中保持不变,但是实际情况下,收到各种因素的影响,会额外产生很多特征点或者干扰点,如果正确的剔除这些干扰点,得到正确匹配的点,利用正确匹配点计算出H才是比较稳定的方式。

01

最小二乘拟合

很明显,图二所示的是一个过约束问题,如果没有干扰点的话,就可以通过最小二乘进行直接拟合,求的参数,其中错误计算如下:

基于过约束方程计算得到错误,反向传播不断更新参数,直到两次错误差值满足要求阈值为止。

02

RANSAC

最小二乘方法在描述子匹配输出的点对质量很好,理想情况下是图像没有噪声污染与像素迁移与光线恒定,但是实际情况下图像特别容易受到光线、噪声导致像素迁移,从而产生额外的多余描述子匹配,这些点对可以分为outlier跟inlier两类,基于RANSAC(Random Sample Consensus)可以很好的过滤掉outlier点对,使用合法的点对得到最终的变换矩阵H。RANSAC算法基本思想是,它会从给定的数据中随机选取一部分进行模型参数计算,然后使用全部点对进行计算结果评价,不断迭代,直到选取的数据计算出来的错误是最小,比如低于0.5%即可,完整的算法流程步骤如下:

  1. 选择求解模型要求的最少要求的随机点对

  2. 根据选择随机点对求解/拟合模型得到参数

  3. 根据模型参数,对所有点对做评估,分为outlier跟inlier

  4. 如果所有inlier的数目超过预定义的阈值,则使用所有inlier重新评估模型参数,停止迭代

  5. 如果不符合条件则继续1~4循环。

通常迭代次数N会选择一个比较高的值,OpenCV中默认迭代次数为200,确保有一个随机选择点对不会有outlier数据,

03

PROSAC(RHO)

注意有时候RANSAC方法不会收敛,导致图像对齐或者配准失败,原因在于RANSAC是一种全随机的数据选取方式,完全没有考虑到数据质量不同。对RANSAC算法的改进算法就是PROSAC(Progressive Sampling Consensus)即渐近样本一致性,该方法采用半随机方法,对所有点对进行质量评价计算Q值,然后根据Q值降序排列,每次只在高质量点对中经验模型假设与验证,这样就大大降低了计算量,在RANSAC无法收敛的情况下,PROSAC依然可以取得良好的结果。OpenCV中的RHO方法就是基于PROSAC估算。

04

LMEDS

最小中值方法拟合,该方法可以看成是最小二乘法的改进,原因在于计算机视觉的输入数据是图像,一般都是各自噪声,这种情况下最小二乘往往无法正确拟合数据,所以采用最小中值方法可以更好实现拟合,排除outlier数据。但是它是对高斯噪声敏感算法。它的最主要步骤描述如下:

  1. 随机选取很多个子集从整个数据集中

  2. 根据各个子集数据计算参数模型

  3. 使用计算出来的参数对整个数据集计算中值平方残差

  4. 最终最小残差所对应的参数即为拟合参数。

05

对比测试

最后看一下OpenCV中使用单应性矩阵发现对相同的特征点对,分别使用RANSAC、PROSAC、LMEDS进行参数矩阵H的求解结果对比,显示如下:

总数446个匹配点对,三种评估方式生成的H矩阵(3x3)很明显值都不尽相同。

一般情况下在,推荐大家使用RANSAC或者RHO。默认的0表示最小二乘方法,对图像匹配在实际应用中一般都是翻车!LMEDS方法只有在inlier超过50%以上情况下才会拟合生成比较好的H参数,而RANSAC或者RHO不管outlier跟inlier比率是多少都会可以适用,可以大家也都注意到h33总是等于1,因为h33在这里作用是保持标准化尺度。在OpenCV中如果无法正确估算参数H,会返回空Mat对象。

单应性矩阵应用

图像透视变换与对象匹配

图像拼接

最后的话

我在2019年的文章汇总中说,2020年少写废话,但愿此篇不是废话,我为了写好它也是伤神很久,算是自己尽力了,也是回答了平时一些人总问我的问题,欢迎大家指正与反馈!如果觉得不错,点个赞我就很满足了!

读书欲精不欲博

用心欲专不欲杂

 推荐阅读 

2019原创技术文章汇总

2018年原创技术文章汇总

OpenCV实战 | 噪声生成与图像加噪声

OpenCV4系统化学习路线图-视频版本!

opencv求两张图像光流_OpenCV单应性矩阵发现参数估算方法详解相关推荐

  1. opencv求两张图像光流_光流(optical flow)和openCV中实现

    转载请注明出处! ! ! 光流(optical flow)和openCV中实现 光流的概念: 是Gibson在1950年首先提出来的. 它是空间运动物体在观察成像平面上的像素运动的瞬时速度.是利用图像 ...

  2. 两图像间的单应性矩阵估计

    两图像间的单应性矩阵估计 单应性矩阵的定义: 两图像间的单应性矩阵估计基于一个假设: 这两个图像拍摄的场景在一个平面上或者两图像是由相机发生纯旋转时采集的.当满足这个假设后,就可以根据两图像上提取的匹 ...

  3. akaze特征匹配怎么去掉不合适的点_单应性矩阵应用基于特征的图像拼接

    点击上方蓝字关注我们 微信公众号:OpenCV学堂 关注获取更多计算机视觉与深度学习知识 前言 前面写了一篇关于单应性矩阵的相关文章,结尾说到基于特征的图像拼接跟对象检测中单应性矩阵应用场景.得到很多 ...

  4. 单应性矩阵H和基础矩阵F

    一.单应性矩阵 单应性矩阵描述的是共面点在两个相机视图下的像素点的约束关系,描述的是点与点之间的约束关系,使用单应矩阵可以找到像点在另一幅图像上对应点的确切位置. 即当已知两幅图像间的单应性矩阵H时, ...

  5. [计算机视觉] 一篇文章教你学会单应性矩阵Homography(Python/C++)

    0.国外原文链接 Homography examples using OpenCV ( Python / C ++ ) 1.什么是单应性? 考虑图中显示的平面.红点代表两个图像中的相同物理点.在计算机 ...

  6. 再谈单应性矩阵及位姿分解

    最近在研究无人驾驶的定位问题,想利用车载摄像头提取的车道线.配合厂商提供的GNSS+IMU(非ADMA级别方案,存在一定误差),还有地图厂商提供的HD map(包含车道线元素)纠正定位.也就是说不依赖 ...

  7. 计算机视觉学习笔记(四)homography 单应性矩阵的理解及求解

    单应性矩阵的理解及求解 1. 齐次坐标(Homogeneous Coordinate) 一幅2D图像上的非齐次坐标为(x,y),而齐次坐标为(x,y,1),也可以写成(x/z,y/z,1)或(x,y, ...

  8. 单应性矩阵的相关理解

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/zinnc/article/details/52319491 尽量写的通俗一点,因为从某种程度上讲,本 ...

  9. 单应性矩阵的理解及求解1

    https://blog.csdn.net/zinnc/article/details/52319491 尽量写的通俗一点,因为从某种程度上讲,本人也是dummy..... 1. 先说homogene ...

最新文章

  1. 2022-2028年中国自主可控行业深度调研及投资前景预测报告(全卷)
  2. 扛鼎之作!Twitter 图机器学习大牛发表160页论文:以几何学视角统一深度学习
  3. 特斯拉发布Q1无人驾驶安全报告:事故增多 但还是比人类少
  4. 二、应用层协议概述与HTTP
  5. 记录一下VsCode配置C/C++运行环境
  6. springboot-web开发(请求映射原理)
  7. Crawler/ML:爬虫技术(基于urllib.request库从网页获取图片)+HierarchicalClustering层次聚类算法,实现自动从网页获取图片然后根据图片色调自动分类
  8. java项目大小_Java项目仅在调整窗口大小之后出现
  9. php表单显示mysql数据库_php用表单形式显示数据库信息
  10. 关于NTDDI_VERSION,_WIN32_WINNT,WINVER的含义
  11. maven snapshot依赖 打包_Maven教程2:Maven项目构建过程练习
  12. Pattern类与Matcher方法的验证
  13. 【SpringCloud】Spring cloud 版本与 spring boot版本对应关系
  14. db设计专用excel_电磁兼容(EMC):工程师必备之硬件EMC设计规范
  15. Linux编译libpcap
  16. 数据结构与算法(一):概论
  17. 【 以项目实战讲解CAD的二次开发(二)】
  18. 海康摄像头录像回放功能
  19. VC++使用OD反汇编引擎(非BC做DLL或LIB包装)
  20. 树莓派的产品定位,以及探讨与ARM开发板的区别

热门文章

  1. 电子到底为什么会干涉?
  2. linux 虚拟仪器,linux平台下编写虚拟仪器系统设计
  3. 第四章 多变量线性回归-机器学习老师板书-斯坦福吴恩达教授
  4. 6.1 无监督学习-机器学习笔记-斯坦福吴恩达教授
  5. 5.11 程序示例--垃圾邮件检测-机器学习笔记-斯坦福吴恩达教授
  6. 一起学nRF51xx 7 -  spi
  7. 【填坑】初识钛极小龟NB-IoT物联网开发套件TiKit
  8. Python Day34
  9. 利用 T-sql 的从句 for xml path('') 实现多行合并到一行, 并带有分隔符
  10. iPhone X掉漆愈演愈烈?手机变成刮刮乐