我是靠谱客的博主 魔幻火车,最近开发中收集的这篇文章主要介绍全景图像拼接——单应计算,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、项目名称:全景图像拼接

二、语言、库和开发环境:C++、opencv249、VS2013

三、参考

1:博客https://blog.csdn.net/zhaocj/article/details/78799194?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

      2:计算机视觉中的多视图几何

 

四、包含原理:

1、特征点

2、2D射影变换

3、相机参数评估

4、拼接缝的查找

4.2  2D射影变换

2.1通俗解释:存在单应H,使得图片src的点映射到图片dst中:dst=H×scr。                    

图像中每一点以三维的齐次形式表示,(x,y,1)t。H中9个未知数,H中最后一个元素固定为1,自由度为8。

在原博客中描述如下:

图像坐标(x, y)所对应的齐次坐标为(x, y, 1),而齐次坐标(x, y, z)所对应的图像坐标为(x/z, y/z)。

2.2 单应计算:

1)DLT

计算单应最简单快速的方法是直接线性DLT算法,在原博客中的描述如下:

 

B)opencv中代码

PS:A为8*9的矩阵,L=AtA,为9*9的矩阵。

其中 第(x,y)处位置值

在每一点:

LtLx,y+=Lxx*Lxx+Lyy*Lyy

 

LtLx,y=L1xx*L1xx+L1yy*L1yy+L2xx*L2xx+L2yy*L2yy

+L3xx*L3xx+L3yy*L3yy +L4xx*L4xx+L4yy*L4yy

LTL在上述两次for循环只计算得到上三角位置处的值,由于LTL矩阵对称,下三角区域可以通过复制对应上三角区域的值得到,减少不必要的计算。

 2)归一化

    上述DLT容易受到任意选取的坐标系原点和尺度的影响,通过归一化变换将其消,归一化算法将提高结果的精度以及消除坐标变换的影响。

    归一化的步骤:第一步:坐标平移;第二步:等量压缩。原博客描述如下:

原博客中注意事项:1)公式(11)中分母为绝对值之和。

                  2)opencv中匹配点到平均点的距离之和也为sqrt(2),原文的博主理解错误,因为在两个维度距离为1,点间总距离为sqrt(1+1)。

 

B) opencv代码

 

3)迭代最小化方法

    考虑到算法的鲁棒性以及精度,通过代价函数最小化方法获得更精确的单应。

目标:从n>4组对应点中获得单应的最大似然估计H。

代价函数:单图像误差。注意事项:原博文描述代价函数为重映射误差,这种描述不准确,容易与重投影误差混淆,其实两者相差很大。

 

在opencv中,使用的算法如下:

    

1.RANSAC 算法,去除野值,得到内点。

a)RANSAC参数初始化

https://file2.kaopuke.com:8081/files_image/2023060522/202306052228339659365.png

N表示抽取的次数,q为s个抽取样本集中至少有一次不是外点的概率,ε表示样本集中外点的比例,s表示每一次抽取样本的数量,s为4。

在参数自适应的算法中,在迭代中计算ε和N,

 ε=1-内点数总点数

https://file2.kaopuke.com:8081/files_image/2023060522/202306052228335771081.png

在opencv的代码中,设定初始N为2000,概率q为0.995。在迭代中使用上述公式重新计算N。

    

     b)RANSAC迭代过程

     1.在RANSAC每一次迭代中,随机从样本集中抽取4组点计算H,要求4组点间互不相同。对应代码mygetSubset

2.计算单应使用DLT。对应代码runKernel

     3.由单应计算判别内点,通过计算单图像误差,阈值设定为3,标记出内点和野值,分别mask为1或0。并将内点最多的单应定位最佳,将当前内点设定为阈值。对应代码myfindInliers

     4.当内点满足阈值时,更新迭代次数N。对应代码cvRANSACUpdateNumIters

     5.找到最佳H,得到内点。对应代码icvCompressPoints

      6.基于全部内点进行DLT计算H

 

2.误差最小化迭代

   单应H的初始值由RANSAC过程得到,误差为单图像误差,使用LM迭代算法,这一过程如原博文所述。对应代码refine

 

 

 

 

B、代码 refine

 

 

 

 

PS:在LM中,8个未知变量,2个误差,因此在迭代中JtJ为8*8,JtErr为8*1矩阵,J为2*8,Err为2*1。

最后

以上就是魔幻火车为你收集整理的全景图像拼接——单应计算的全部内容,希望文章能够帮你解决全景图像拼接——单应计算所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部