概述
一、项目名称:全景图像拼接
二、语言、库和开发环境: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参数初始化
N表示抽取的次数,q为s个抽取样本集中至少有一次不是外点的概率,ε表示样本集中外点的比例,s表示每一次抽取样本的数量,s为4。
在参数自适应的算法中,在迭代中计算ε和N,
ε=1-内点数总点数
在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。
最后
以上就是魔幻火车为你收集整理的全景图像拼接——单应计算的全部内容,希望文章能够帮你解决全景图像拼接——单应计算所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复