我有一个算法,使用OpenCV的findHomography
计算单个图像中多个标记的单应性。这样可以正常工作,但是由于标记的大小/图像的分辨率,计算的旋转通常非常不准确(主要围绕标记的x和z轴,假设y为up)。我很想找到一种方法来改善这一点。
我有一个假设,即我知道所有标记都在同一个平面上(它们在桌面上)应该有助于改善单应性 - 我只需要计算出标记周围的旋转单轴 - 但我不太了解将其付诸实践。任何人都可以给我任何指导吗?
这是我试图处理的情况的一个例子(标记上的图像实际上是不同的)。
答案 0 :(得分:1)
我喜欢通过使用遍布场景的多个标记图像来获得估计单应性的更高精度的想法。
这种方法可以使用非线性优化来实现。但这有点棘手。
让我们以3个打印标记图像放在桌子上的例子为例,假设你所有的假设都存在。
现在让我们假设您已经找到3个打印的标记图像中的每一个N
点对应。
此处的点对应表示对于打印的标记图像,您可以将N
图像像素位置与相应的N
真实世界位置相关联 {{ 1}}以厘米(或其他单位)相对于已知的真实世界"打印的标记坐标系" (例如,坐标(x,y)
位于标记图像的中心)。
问题在于打印标记坐标系"对于每个打印的标记图像仅在本地已知。我们需要的是将这些坐标系统结合在一起并找到一种表达打印标记坐标系的方法。在单个全球坐标系中的位置。所以我们需要弄清楚它们之间的关系。
我们想要计算使用来自不同打印标记图像的所有对应数据的单应性。因此,了解它们与每种方法的关系非常重要。具体来说,我们希望找到所有标记图像的公共坐标系,以便制定优化问题。
现在,基于点对应,并使用传统方法,计算3个单应性:
(0,0)
地图"打印标记坐标系"标记图像#1到图像像素坐标的位置H1
地图"打印标记坐标系"标记图像#2到图像像素坐标的位置H2
地图"打印标记坐标系"标记图像#3到图像像素坐标的位置让我们假设不存在测量和计算错误(只是假设)。然后,单应性仅在各个"打印标记坐标系的旋转和平移上不同。
然后,以下等式成立:
旋转和平移定义如下:
这意味着H1等于H2"直到"旋转和翻译和H1等于H3"直到"轮换和翻译。
这为我们提供了一种方法,用于将标记图像#2的位置转换为标记图像#1的坐标系(标记图像#3的位置的情况可以类似地处理):
现在,在现实世界的情景中,这些方程式只能保持近似。但是,它们给出了估算任何一对打印标记图像之间的旋转和平移的动机:
现在,使用atan2,我们可以找到六个辅助变量的估计值,它们描述了打印的标记图像#2和#3相对于#1的位置。
这就是我们准备开始值和模型来制定非线性优化问题所需的一切。
最终目标是找到单应矩阵H3
的8个系数,它们同时使用所有打印标记图像的所有点对应关系:
使用上述模型,我们可以定义一个非线性方程组。它会有H
未知数:
使用3个标记图像的8 + 6
点对应关系,得到N
方程。这意味着,我们需要N*3*2 = N*6
点对应,以便获得比未知数更多的方程。有趣的是,在多标记图像场景的情况下,每个标记图像的最小N>=3
对应关系小于单个标记图像场景的最小N=3
。
此时我不会更详细地添加非线性优化问题的表述,因为已经解释了如何解决问题的一般概念。
为了解决非线性优化问题,例如可以使用Newton’s method。
上述方程中的所有矩阵都需要按如下方式进行归一化:
答案 1 :(得分:0)
单应性模型假定您的标记在平面上。这不是您可以添加的其他信息。如果你的标记不是和一个平面,那么该功能根本不起作用。
如果您的标记都在图像平面中,即所有图像都是顶视图图像,那么您可以使用仿射模型(或更低)而不是单应性。你的问题不清楚是否是这种情况。
如果所有标记始终位于同一平面上,则可以同时计算所有标记的平面单应性。结果应该在数值上更稳定,您拥有的点越多,它们越过图像。它应该比独立计算每个标记的单应性更准确。
问题是您的对应点是什么 - 您还需要知道图像中标记的相对位置。
如果使用相同的参考标记图像,计算很可能会失败。