我从事增强现实和视觉跟踪应用程序的相机姿态估计这一主题已有一段时间了,我认为尽管有很多关于此任务的详细信息,但仍然存在很多困惑和误解。

我认为接下来的问题应该得到详细的逐步解答。如何从平面标记中计算单应性?
如果有单应性,如何获取相机的姿态?


评论

我对您执行的重新规范化感到模糊:1. H是使用某些过程(例如SVD)从数据中找到的单应性。 2. inv(K)* H = A是您在此处使用的对象。然后,使q1 = a1 / norm(a1)和q2 = a2 / norm(a2)作为旋转矩阵的正交列,并使q3 = q1xq2 ...然后取t /(某物)来获得平移矢量。您如何将q1和q2除以可能不同的东西,以及如何选择将t除以什么呢?或者是SVD过程和与inv(K)的乘积给出了接近但不完全正交/正交的旋转矩阵的想法,因此,

但是如何获得3D点(X,Y,1)?

#1 楼

重要的是要了解,这里唯一的问题是获取外部参数。相机内部特性可以离线测量,为此有很多应用。
什么是相机内部特性?
相机内部特性参数通常称为相机校准矩阵$ K $。我们可以写
$$ K = \ begin {bmatrix} \ alpha_u&s&u_0 \\ 0&\ alpha_v&v_0 \\ 0&0&1 \ end {bmatrix} $$
其中


$ \ alpha_u $和$ \ alpha_v $是$ u $和$ v $坐标方向上的比例因子,并且与相机的焦距$ f $成比例:$ \ alpha_u = k_u f $和$ \ alpha_v = k_v f $。 $ k_u $和$ k_v $是$ u $和$ v $方向上每单位距离的像素数。


$ c = [u_0,v_0] ^ T $被称为主要点,通常是图像中心的坐标。


$ s $是偏斜,如果$ u $和$ v $不垂直,则只能为零。 />

当已知内在函数时,将对摄像机进行校准。这很容易做到,因此它不是计算机视觉中的目标,而是离线的琐碎步骤。


一些链接:
ftp:// svr- ftp.eng.cam.ac.uk/pub/reports/mendonca_self-calibration.pdf


什么是相机外部性?
相机外部性或外部参数$ [R | t ] $是$ 3 \ times4 $矩阵,对应于从世界坐标系到摄影机坐标系的欧几里得变换。 $ R $表示$ 3 \ times3 $旋转矩阵,而$ t $表示转换。
计算机视觉应用程序专注于估计此矩阵。
$$ [R | t] = \ begin {bmatrix} R_ {11}&R_ {12}&R_ {13}&T_x \\ R_ {21}&R_ {22}&R_ {23}&T_y \\ R_ {31}&R_ {32}&R_ {33}&T_z \ end {bmatrix} $$
如何从平面标记计算单应性?
同形异像学是同质的3×3矩阵,它关联3D平面及其图像投影。如果我们有一个平面$ Z = 0 $,则将点$ M =(X,Y,0)^ T $映射到该平面及其对应的2D点$ m $在投影$ P =下的单应性$ H $ K [R | t] $ is
$$ \ tilde m = K \ begin {bmatrix} R ^ 1&R ^ 2&R ^ 3&t \ end {bmatrix} \ begin {bmatrix} X \\ Y \\ 0 \\ 1 \ end {bmatrix} $$
$$ = K \ begin {bmatrix} R ^ 1&R ^ 2&t \ end {bmatrix} \ begin {bmatrix} X \\ Y \\ 1 \ end {bmatrix} $$
$$ H = K \ begin {bmatrix} R ^ 1&R ^ 2&t \ end {bmatrix} $$
为了计算单应性,我们需要点对世界-相机。如果有平面标记,则可以对其进行图像处理以提取特征,然后在场景中检测这些特征以获得匹配。
我们只需要4对就可以使用直接线性变换计算单应性。
如果我有单应性,该如何获得相机的姿态?两者的最后一列是翻译向量。第一列$ H ^ 1 $和两个$ H ^ 2 $也是相机姿势矩阵的第一列$ R ^ 1 $和两个$ R ^ 2 $。它仅位于$ [R | t] $的第三列$ R ^ 3 $,并且由于必须正交,因此可以将其计算为第一和第二列的叉积:
$$ R ^ 3 = R ^ 1 \ otimes R ^ 2 $$
由于冗余,必须对$ [R | t] $除以例如矩阵的元素[3,4]进行归一化。

评论


$ \ begingroup $
我认为说校准“容易而不是CV的目标”是一种误导。在通常情况下,我们还需要估计失真参数。除了自我校准之外,我建议使用平面校准(Zhang-相机校准的一种灵活的新技术),因为如果可以执行单独的校准程序,它将更加灵活。您还存在“如果我有单应性,如何获得相机姿势?”的小错误。因为您没有考虑到校准(H_ {calib} = K ^ -1H)。
$ \ endgroup $
–buq2
2012年7月1日在5:34



$ \ begingroup $
单应性相机姿态是错误的。有几种方法可以做到,其中有些是非常重要的。
$ \ endgroup $
–mirror2image
2012年7月5日,11:52

$ \ begingroup $
我不明白为什么这是错误的。我以此方式计算并可以正常工作。你为什么说错了?
$ \ endgroup $
–Jav_Rock
2012年7月5日在12:29

$ \ begingroup $
您在上一节中写道H ^ 1和R ^ 1相等,但是在第三节中您声明H = K [RT]意味着R ^ 1实际上是K ^ -1H ^ 1 。但这并不是严格意义上的,因为有无限数量的H满足方程式,并且在求解R ^ 1,R ^ 2和T(未知标度)时会引起问题。您的答案无视稳健的本征和失真校准,并且某些方程式有误,因此这不是该问题的好答案。
$ \ endgroup $
–buq2
2012年7月5日在22:23

$ \ begingroup $
是的,当我从代码中提取此值时,我在第三步中丢失了校准矩阵,并且在代码的另一个函数中乘以K。
$ \ endgroup $
–Jav_Rock
2012年7月6日在7:58

#2 楼

尽管很好地解释了二维情况,但Jav_Rock提出的答案并未为三维空间中的相机姿势提供有效的解决方案。注意,对于该问题,存在多种可能的解决方案。

本文提供了用于分解单应性的封闭公式,但是这些公式有些复杂。

OpenCV 3已经完全实现了这种分解(decomposeHomographyMat)。给定单应性和正确缩放的本征矩阵,该函数将提供一组四个可能的旋转和平移。

这种情况下的内在矩阵需要以像素为单位给出,这意味着您的主点通常是(imageWidth / 2, imageHeight / 2),而焦距通常是focalLengthInMM / sensorWidthInMM * imageHeight

评论


$ \ begingroup $
什么是正确缩放的本征矩阵?
$ \ endgroup $
– Guig
17年6月23日在5:38

$ \ begingroup $
我已经更新了答案。请参阅上面。
$ \ endgroup $
–艾米斯威尔特
17年6月23日在8:33

$ \ begingroup $
@Emiswelt,嘿,焦距不是focusLengthInMM / sensorWidthInMM * imageWidth吗?为什么选择高度?
$ \ endgroup $
– El Marce
18年5月22日在2:32