【问题标题】:Accurate (and fast) angle matching准确(快速)的角度匹配
【发布时间】:2015-07-09 08:22:47
【问题描述】:

对于一个爱好项目,我正在尝试对齐照片并创建 3D 图片。我基本上有两个相机在一个钻机上,我用来拍照。我会自动尝试对齐图像,以便您获得 3D SBS 图像。

它们是高分辨率图像,这意味着要处理大量像素。因为我对计算机不是很耐心,所以我希望事情进展得快。

最初我使用基于图像拼接和特征提取的代码。在实践中,我发现这些算法太不准确而且太慢了。主要原因是你这里有不同的深度级别,所以你不能做一对一的特征匹配。大多数代码已经可以正常工作,包括垂直对齐。

对于这个问题,您可以假设图像的不同 ISO 曝光级别/颜色校正和垂直对齐都得到了处理。

现在还缺少一个很好的算法来校正图片的角度。我注意到左右图片的角度通常会变化很小的度数(想想 +/- 1.2 度的差异),这足以引起轻微的头痛。作为人类,您可以通过查看颜色的明显差异并将它们排列起来轻松发现这一点。

这里具有讽刺意味的是,如果它正确与否,您会立即将其识别为人类,但不知何故,我无法向机器学习这一点。 :-)

我已经尝试过边缘检测器、霍夫变换和各种自制算法,但到目前为止,我发现所有这些算法对于我的目的来说都太慢而且太不准确。我还尝试在稍微改变角度的同时迭代地垂直对齐,到目前为止没有任何运气。

请注意:在这里,准确性可能比速度更重要。


我在此处添加了示例图片。它实际上是左右眼,阿尔法混合。如果您仔细观察,您会看到顶部的羔羊有两个椭圆,并且您可以看到椅子在顶部并没有完全对齐。这似乎可以忽略不计,但在使用投影仪的全屏分辨率下,您会很容易看到差异。这也显示了所需的准确度;很多。

“x”方向的移动会产生 3D 效果。基本上,如果 shift 为 0,它在屏幕上,如果它是 0,它在屏幕前面。这也使匹配变得更加困难,因为您不是在寻找“缝合”。

基本上两个摄像头的“看”方向相同(与此处的第二张图片垂直:http://www.triplespark.net/render/stereo/create.html)。

差异源于相机的角度略有不同。这意味着整个图片的旋转是均匀的。

【问题讨论】:

  • 这些角度差异难道不是创建 3D 模型的关键吗?那么你为什么要尝试“纠正”这些角度呢?
  • @DrKoch,不,3D 的关键是 x 坐标差异。也就是说,如果某个片段在一张图片上是水平的,那么它在另一张图片上应该是水平的,只有当它的末端在 3D 中应该处于不同的深度时,它才可能具有不同的长度。
  • 这些垂直方向的“错误”是否会在您的图片中有所不同?还是它们只是由“倾斜”的相机引起的?
  • 我添加了一些关于我的问题的更多细节。误差小而均匀:它们是安装在三脚架上的 2 个完全相同的相机。

标签: image algorithm 3d angle


【解决方案1】:

我曾经使用过以下业余方法。

假设第二张图片有旋转+垂直移位不匹配。这意味着我们需要对第二张图像应用一些变换,它可以用矩阵形式表示为

x' = a*x + b*y + c
y' = d*x + e*y + f

也就是说,第二张图像上坐标为(x,y) 的每个像素都应移动到位置(x',y') 以补偿这种旋转和垂直移动。

我们对a=eb=-dd*d+e*e=1 有严格的要求,所以它确实是旋转+移位,没有缩放或倾斜等。这个符号也允许水平移位,但这很容易修复角度+垂直偏移校正后。

现在在两张图片上选择几个共同的特征(我是手动选择的,因为只有 5-10 个似乎就足够了,你可以尝试应用一些自动特征检测机制)。假设i-th 特征在第一张图像上具有坐标(x1[i], y1[i]),在第二张图像上具有坐标(x2[i], y2[i])。我们希望在转换后特征尽可能相等y-坐标,这就是我们想要的(理想情况下)

y1[i]=y2'[i]=d*x2[i]+e*y2[i]+f

有足够的(>=3)个特征,我们可以从这个要求中确定def。事实上,如果你有 3 个以上的特征,你很可能找不到共同的 def,但你可以应用最小二乘法找到 d、@ 987654339@ 和 f 使y2' 尽可能接近y1。您还可以在查找def 时考虑d*d+e*e=1 的要求,但据我所知,即使不考虑这一点,我也得到了可以接受的结果。

确定def后,就有了a=eb=-d的要求。这只留下cunknown,即水平移位。如果你知道水平移位应该是什么,你可以从那里找到c。我使用背景(例如风景上的云)来获取c

当您知道所有参数后,您可以对图像进行一次传递并进行校正。您可能还想应用一些抗锯齿,但这是另一个问题。

另请注意,您可以以类似的方式将二次校正引入公式,以解决相机通常具有的额外失真。


不过,这只是我前段时间遇到同样问题时想出的一个简单算法。我没有做太多研究,所以我很高兴知道是否有更好或完善的方法,甚至是现成的软件。

【讨论】:

  • 是的,我也遵循这个推理以获得更多功能,但最终放弃了它。问题是该解决方案隐含假设所有深度级别都相同,从而为 x 坐标提供“固定”偏斜。如果您只看 1 个深度级别,这是正确的,但不是针对整体图片,因为不同的 x 倾斜会给您 3D 效果。对? PS:我这样做是为了补偿颜色;效果很好。
  • @atlaste,我不认为不同的x 会带来任何问题,因为当涉及旋转时,x 只是相机矩阵上的坐标,没有深度信息。也就是说,如果我们只需要旋转给定的单个图像以补偿相机旋转,我们就不需要考虑深度。当我们将其与第一张图像进行比较时,深度变得很重要,但我不会比较来自不同图像的xs。
  • @atlaste,反正角度本身很小,x坐标的差异也很小,这是二阶效应,没有旋转本身那么重要。
  • 嗯,我试一试;让我们看看发生了什么。如果我有一些结果,我会告诉你。感谢到目前为止。 PS:一旦一切顺利,我很有可能最终将我的爱好项目开源。
  • 我刚刚尝试了一个简单但又不错的想法。作为功​​能,我在图像中使用了高颜色渐变(实际上有点不同,但是嘿)。然后我将图像分割成几个水平(大)条,在条之间关联并应用最小二乘。一个简单的反正切和一些基本的数学可以完成剩下的工作。我打算写下所有的细节并发布它,包括。几周后的源代码 - 我会告诉你的。足以说它实际上工作得很好,而且它真的炽热快。感谢您的启发,它真的很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 2020-02-26
  • 2012-03-16
  • 1970-01-01
  • 2021-11-09
  • 2016-02-14
相关资源
最近更新 更多