准确(且快速)的角度匹配
Accurate (and fast) angle matching
对于一个业余项目,我正在尝试对齐照片并创建 3D 图片。我基本上在一个钻机上有 2 个相机,我用来拍照。我会自动尝试以您获得 3D SBS 图像的方式对齐图像。
它们是高分辨率图像,这意味着需要处理大量像素。因为我对电脑不是很耐心,所以我希望事情进展得快。
最初我使用基于图像拼接和特征提取的代码。在实践中,我发现这些算法太不准确而且太慢。主要原因是你在这里有不同层次的深度,所以你不能进行一对一的特征匹配。大多数代码已经可以正常工作,包括垂直对齐。
对于这个问题,您可以假设不同的 ISO 曝光级别/颜色校正和图像的垂直对齐都得到了处理。
还欠缺一个很好的图片角度校正算法。我注意到左右图片通常在角度上有很小的角度变化(想想 +/- 1.2 度的差异),这足以让人感到轻微的头痛。作为人类,您可以通过观察颜色的明显差异并将它们排列起来,轻松发现这一点。
具有讽刺意味的是,无论正确与否,您都会立即将其作为人类发现,但不知何故我无法将其学习给机器。 :-)
我已经尝试过边缘检测器、霍夫变换和各种自制算法,但到目前为止发现它们都太慢而且对我的目的来说太不准确。我也尝试过在稍微改变角度的同时迭代垂直对齐,到目前为止没有任何运气。
请注意:此处准确性可能比速度更重要。
我在这里添加了示例图片。它实际上是左眼和右眼,alpha 混合。如果仔细观察,您会看到顶部的小羊有两个椭圆,而且您会看到椅子并没有完全排在顶部。这似乎可以忽略不计,但在使用投影仪的全屏分辨率下,您会很容易看出差异。这也显示了所需的准确度;挺多的。
向 'x' 方向移动会产生 3D 效果。基本上,如果位移为 0,则它在屏幕上,如果它 <0 则它在屏幕后面,如果它 >0 则它在屏幕前面。这也使匹配变得更加困难,因为您不是在寻找 'stitch'.
基本上两个摄像头的'look'在同一个方向(这里的第二张图是垂直的:http://www.triplespark.net/render/stereo/create.html)。
不同之处在于相机的角度略有不同。这意味着整个画面的旋转是均匀的。
我曾经使用过以下业余方法。
假设第二张图片有旋转+垂直偏移不匹配。这意味着我们需要对第二张图像应用一些变换,可以用矩阵形式表示为
x' = a*x + b*y + c
y' = d*x + e*y + f
也就是说,第二张图片上坐标为 (x,y)
的每个像素都应移动到 (x',y')
的位置,以补偿这种旋转和垂直偏移。
我们严格要求a=e
,b=-d
和d*d+e*e=1
,这样确实是旋转+平移,不能缩放,不能倾斜等。而且这个符号允许水平移动也是,不过角度+垂直偏移校正后这个问题很容易解决。
现在 select 两个图像上的几个共同特征(我手动 selection,因为 5-10 似乎足够了,您可以尝试应用一些自动特征检测机制)。假设第 i
个特征在第一张图像上的坐标为 (x1[i], y1[i])
,在第二张图像上的坐标为 (x2[i], y2[i])
。我们希望在转换后特征具有尽可能相等的 y
坐标,这就是我们想要的(理想情况下)
y1[i]=y2'[i]=d*x2[i]+e*y2[i]+f
有足够的(>=3)个特征,我们可以根据这个要求确定d
、e
和f
。事实上,如果你有超过 3 个特征,你很可能无法为它们找到共同的 d
、e
和 f
,但你可以应用最小二乘法来找到使 y2'
尽可能接近 y1
的 d
、e
和 f
。您还可以在找到 d
、e
和 f
时考虑 d*d+e*e=1
的要求,但据我所知,即使不考虑这一点,我也得到了可接受的结果。
在确定了d
、e
和f
之后,就得到了a=e
和b=-d
的要求。这样就只剩下 c
未知,也就是水平偏移。如果你知道水平移动应该是多少,你可以从那里找到 c
。我使用背景(例如风景上的云)得到 c
.
当你知道所有参数后,你可以对图像进行一次传递并对其进行校正。您可能还想应用一些抗锯齿,但这是另一个问题。
另请注意,您可以以类似的方式对公式引入二次校正,以解决相机通常具有的额外失真问题。
然而,这只是我前段时间遇到同样问题时想出的一个简单算法。我没有做太多研究,所以我很高兴知道是否有更好或成熟的方法,甚至是现成的软件。
对于一个业余项目,我正在尝试对齐照片并创建 3D 图片。我基本上在一个钻机上有 2 个相机,我用来拍照。我会自动尝试以您获得 3D SBS 图像的方式对齐图像。
它们是高分辨率图像,这意味着需要处理大量像素。因为我对电脑不是很耐心,所以我希望事情进展得快。
最初我使用基于图像拼接和特征提取的代码。在实践中,我发现这些算法太不准确而且太慢。主要原因是你在这里有不同层次的深度,所以你不能进行一对一的特征匹配。大多数代码已经可以正常工作,包括垂直对齐。
对于这个问题,您可以假设不同的 ISO 曝光级别/颜色校正和图像的垂直对齐都得到了处理。
还欠缺一个很好的图片角度校正算法。我注意到左右图片通常在角度上有很小的角度变化(想想 +/- 1.2 度的差异),这足以让人感到轻微的头痛。作为人类,您可以通过观察颜色的明显差异并将它们排列起来,轻松发现这一点。
具有讽刺意味的是,无论正确与否,您都会立即将其作为人类发现,但不知何故我无法将其学习给机器。 :-)
我已经尝试过边缘检测器、霍夫变换和各种自制算法,但到目前为止发现它们都太慢而且对我的目的来说太不准确。我也尝试过在稍微改变角度的同时迭代垂直对齐,到目前为止没有任何运气。
请注意:此处准确性可能比速度更重要。
我在这里添加了示例图片。它实际上是左眼和右眼,alpha 混合。如果仔细观察,您会看到顶部的小羊有两个椭圆,而且您会看到椅子并没有完全排在顶部。这似乎可以忽略不计,但在使用投影仪的全屏分辨率下,您会很容易看出差异。这也显示了所需的准确度;挺多的。
向 'x' 方向移动会产生 3D 效果。基本上,如果位移为 0,则它在屏幕上,如果它 <0 则它在屏幕后面,如果它 >0 则它在屏幕前面。这也使匹配变得更加困难,因为您不是在寻找 'stitch'.
基本上两个摄像头的'look'在同一个方向(这里的第二张图是垂直的:http://www.triplespark.net/render/stereo/create.html)。
不同之处在于相机的角度略有不同。这意味着整个画面的旋转是均匀的。
我曾经使用过以下业余方法。
假设第二张图片有旋转+垂直偏移不匹配。这意味着我们需要对第二张图像应用一些变换,可以用矩阵形式表示为
x' = a*x + b*y + c
y' = d*x + e*y + f
也就是说,第二张图片上坐标为 (x,y)
的每个像素都应移动到 (x',y')
的位置,以补偿这种旋转和垂直偏移。
我们严格要求a=e
,b=-d
和d*d+e*e=1
,这样确实是旋转+平移,不能缩放,不能倾斜等。而且这个符号允许水平移动也是,不过角度+垂直偏移校正后这个问题很容易解决。
现在 select 两个图像上的几个共同特征(我手动 selection,因为 5-10 似乎足够了,您可以尝试应用一些自动特征检测机制)。假设第 i
个特征在第一张图像上的坐标为 (x1[i], y1[i])
,在第二张图像上的坐标为 (x2[i], y2[i])
。我们希望在转换后特征具有尽可能相等的 y
坐标,这就是我们想要的(理想情况下)
y1[i]=y2'[i]=d*x2[i]+e*y2[i]+f
有足够的(>=3)个特征,我们可以根据这个要求确定d
、e
和f
。事实上,如果你有超过 3 个特征,你很可能无法为它们找到共同的 d
、e
和 f
,但你可以应用最小二乘法来找到使 y2'
尽可能接近 y1
的 d
、e
和 f
。您还可以在找到 d
、e
和 f
时考虑 d*d+e*e=1
的要求,但据我所知,即使不考虑这一点,我也得到了可接受的结果。
在确定了d
、e
和f
之后,就得到了a=e
和b=-d
的要求。这样就只剩下 c
未知,也就是水平偏移。如果你知道水平移动应该是多少,你可以从那里找到 c
。我使用背景(例如风景上的云)得到 c
.
当你知道所有参数后,你可以对图像进行一次传递并对其进行校正。您可能还想应用一些抗锯齿,但这是另一个问题。
另请注意,您可以以类似的方式对公式引入二次校正,以解决相机通常具有的额外失真问题。
然而,这只是我前段时间遇到同样问题时想出的一个简单算法。我没有做太多研究,所以我很高兴知道是否有更好或成熟的方法,甚至是现成的软件。