0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

OpenCV学堂 来源:OpenCV学堂 作者:OpenCV学堂 2022-07-13 16:16 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

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

 1//--Localizetheobject
 2std::vectorobj_pts;
 3std::vectorscene_pts;
 4for(size_ti=0;i< goodMatches.size(); i++)
 5{
 6//--Getthekeypointsfromthegoodmatches
 7obj_pts.push_back(keypoints_obj[goodMatches[i].queryIdx].pt);
 8scene_pts.push_back(keypoints_sence[goodMatches[i].trainIdx].pt);
 9}
10MatH=findHomography(obj_pts,scene_pts,RHO);

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

1//--Getthecornersfromtheimage_1(theobjecttobe"detected")
2std::vectorobj_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::vectorscene_corners(4);
6perspectiveTransform(obj_corners,scene_corners,H);

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

da958888-0283-11ed-ba43-dac502259ad0.jpg

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

1Matcv::findHomography(
2InputArraysrcPoints,
3InputArraydstPoints,
4intmethod=0,
5doubleransacReprojThreshold=3,
6OutputArraymask=noArray(),
7constintmaxIters=2000,
8constdoubleconfidence=0.995
9)

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

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

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

  • LMEDS – 最小中值

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

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

单应性矩阵H发现方法

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

dab86f38-0283-11ed-ba43-dac502259ad0.png

其中H是一个3x3的矩阵

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

01

最小二乘拟合

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

dad13464-0283-11ed-ba43-dac502259ad0.png

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

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的求解结果对比,显示如下:

dae3fd4c-0283-11ed-ba43-dac502259ad0.png

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

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

单应性矩阵应用

图像透视变换与对象匹配

daf600dc-0283-11ed-ba43-dac502259ad0.jpg

图像拼接

db10fba8-0283-11ed-ba43-dac502259ad0.jpg

最后的话

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

审核编辑 :李倩
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像
    +关注

    关注

    2

    文章

    1096

    浏览量

    42437
  • 矩阵
    +关注

    关注

    1

    文章

    450

    浏览量

    36253
  • 函数
    +关注

    关注

    3

    文章

    4421

    浏览量

    67826

原文标题:OpenCV单应性矩阵发现参数估算方法详解

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Renesas 4508 Group芯片4位CMOS微计算机技术剖析

    Renesas 4508 Group芯片4位CMOS微计算机技术剖析 引言 在电子设计领域,微计算机芯片的性能和特性对产品的整体表现起着关键作用。Renesas 4508 Group
    的头像 发表于 04-13 14:20 94次阅读

    Moku升级实时计算并显示g(2)二阶关联函数及最新活动更新

    摘要Moku时间间隔与频率分析仪(TFA)功能进一步升级,在时间间隔测量精度与检测配置灵活性方面实现显著提升。全新版本支持实时计算并可视化显示g(2)二阶关联函数,为量子光学、光子探测及相关前沿
    的头像 发表于 01-22 16:45 3218次阅读
    Moku升级实时<b class='flag-5'>计算</b>并显示g(2)二阶关联<b class='flag-5'>函数</b>及最新活动更新

    这家公司研发玻璃光计算芯片,算力超传统AI推理芯片千倍

    之间几乎无缝兼容,具有较高的工艺成熟度和集成便利。然而,纯硅调制存在诸多局限性,其中最为突出的是矩阵规模扩展困难。从64×64扩大至128×128的矩阵规模,竟然间隔了三年之久,这严重制约了光
    的头像 发表于 01-19 07:09 7394次阅读

    炎核开源开放平台上架推出OpenSparseBlas高性能稀疏计算

    在科学计算与工程仿真领域,高效处理大规模稀疏矩阵运算是提升整体计算效能的关键。为此,我们在炎核开源开放平台上架推出 OpenSparseBlas——一个专为稀疏矩阵/向量
    的头像 发表于 12-15 15:18 969次阅读

    mtf 光学传递函数如何影响图像的质量?

    调制传递函数(MTF):光学系统的“清晰度”度量调制传递函数(ModulationTransferFunction,简称MTF)是光学成像领域中一个核心概念,用于量化成像系统对物体细节的传递能力。它
    的头像 发表于 12-04 16:55 1826次阅读
    mtf 光学传递<b class='flag-5'>函数</b>如何影响图像的质量?

    基于米尔RK3576的环视实时方案解析

    张正友标定法预先获取摄像头内参和畸变系数,实时消除鱼眼镜头产生的图像扭曲。投影变换: 通过预设的矩阵(Homography Matrix),将矫正后的透视图像转换为统一的俯瞰视角
    发表于 11-28 16:57

    高清混合矩阵 vs 传统矩阵:别再瞎选!3 大核心差异 + 行业选型攻略,选错可能亏大了

    ” 与 “传统矩阵切换器”,二者在应用场景适配、信号兼容、核心处理能力等维度存在本质区别,分别对应不同层级的视听需求。本文将从实际应用出发,结合技术参数与场景案例,全方位拆解两类设备的差异,为不同行业的选型提供精准参考
    的头像 发表于 11-12 10:42 604次阅读
    高清混合<b class='flag-5'>矩阵</b> vs 传统<b class='flag-5'>矩阵</b>:别再瞎选!3 大核心差异 + 行业选型攻略,选错可能亏大了

    计算程序执行指令数的函数实现

    探究过程 1、官方提供的计算周期数指令数方法为,采用如下这几个函数在所要计算的操作前后获取一次当前指令数和周期数。并求他们的差值,以此得到结果。 2、首先找到这几个函数原型在hbi
    发表于 10-28 06:27

    纳芯微推出全新NS800RT7P65S/D系列实时控制MCU

    纳芯微再度扩充NSSine 实时控制MCU/DSP产品矩阵,推出全新NS800RT7P65S/D系列MCU/DSP,该系列采用/双Cortex-M7内核@400MHz内核,每个内核配备自研eMath/mMath加速核,支持数学函数
    的头像 发表于 09-03 14:28 4156次阅读
    纳芯微推出全新NS800RT7P65S/D系列实时控制MCU

    求助,关于STM32H743使用DSP进行矩阵求逆计算出现的问题求解

    我正在STM32H743上实现一个算法,需要进行一个20*20的矩阵求逆,但是计算结果与matlab对比差距非常大,完全不正确,原矩阵A的部分数值类似如下: 在matlab中求逆的部分结果如下: 但是在STM32H743中的
    发表于 08-08 07:24

    C语言中的内联函数与宏

    在C编程中,内联函数和宏都用于避免函数调用的开销并编写可复用的逻辑部分,但它们在工作方式和安全方面存在显著差异。
    的头像 发表于 07-25 15:10 2065次阅读
    C语言中的内联<b class='flag-5'>函数</b>与宏

    无刷直流电机状态方程系数矩阵的动态更新

    在无刷直流电机控制系统的仿真中如何快速动态地求解无刷直流电机的状态方程组是一个关键问题在 Matlab/Simulink 环境中,利用C语言形式的系统函数来构建仿真模块,可灵活快速地实现复杂系统
    发表于 07-09 14:17

    深入理解C语言:函数—编程中的“积木块”艺术

    键问题:1.避免重复:将重复代码封装成函数,实现“一处修改,全局生效”,让维护更高效。2.逻辑清晰:每个函数专注一个特定任务(如计算、显示等),代码可读大幅提升。3.
    的头像 发表于 06-30 17:26 2032次阅读
    深入理解C语言:<b class='flag-5'>函数</b>—编程中的“积木块”艺术

    高压端探头设计中的器材如何选型

    在高压端探头设计的过程中,器材的选型是尤为重要的,这决定探头的性能,可靠和安全等重要环节。从电气性能到机械结构,每一个器件的选型都要经过深思熟虑,本文主要从电气性能方面探讨,应该如何进行器材的选型。
    的头像 发表于 06-05 18:07 629次阅读

    RISC-V向量处理器:现代计算的革命引擎

    瓶颈等问题愈发突出。以人工智能领域为例,深度学习模型训练需要进行海量矩阵运算和复杂的神经网络计算,对计算设备的计算能力和并行处理能力要求极高;在大数据分析场景中,快
    的头像 发表于 06-04 10:03 1843次阅读
    RISC-V向量处理器:现代<b class='flag-5'>计算</b>的革命<b class='flag-5'>性</b>引擎