OpenCV中实现的立体声BM和SGBM算法中的斑点是什么

时间:2019-07-09 13:32:37

标签: python-3.x opencv stereo-3d

在应用OpenCV中实现的立体声BM和SGBM算法时,我遇到了“斑点噪声”的概念,该斑点噪声通过斑点过滤器过滤,其特征在于其“ speckleWindowSize”和“ speckleRange参数” =>参见openCV的文档在link to OpenCV doc

首先,什么是斑点噪声?是什么引起的?

第二,在上面的链接中,您可以找到以下定义(它们并没有真正解释任何内容,只是给出了似乎无处可寻的范围):

“ speckleWindowSize:要考虑其斑点噪声并使之无效的平滑视差区域的最大大小。将其设置为0以禁用斑点滤波。否则,将其设置在50-200范围内。”

“ speckleRange:每个连接的组件内的最大视差变化。如果执行斑点过滤,请将参数设置为正值,它将隐式乘以16。通常,1或2就足够了。”

而加里·布拉德斯基(Gary Bradski)和阿德里安·凯勒(Adrian Kaehler)着名的“ Learning OpenCV”书为speckleWindowSize提供了另一种范围:

“基于块的匹配在对象边界附近存在问题,因为匹配窗口一侧抓住了前景,而另一侧抓住了背景。这就是在局部区域中我们称之为散斑的大小差异的结果。为防止这些边界线匹配,我们可以通过设置speckleWindowSize在斑点窗口上设置斑点检测器(大小范围从5×5到21×21),对于9×9,默认设置为9 9窗口。在散斑窗口中,只要检测到的最小和最大差异在speckleRange之内,就允许匹配(默认范围设置为4)。“

通过测试,看来我可以有效地增大到200个窗口大小,但是如果以像素表示,那不是一个大窗口吗?

此外,以上文字对什么是斑点进行了解释。据我了解,我们的背景视差值很小,而前景的视差值很大,这恰恰是……。因此,我不明白为什么将其视为噪声以及为什么要对其进行过滤?

我们将不胜感激

谢谢。

1 个答案:

答案 0 :(得分:0)

使用任何提供的视差算法时,如果应用后置过滤,则可能会获得更好的结果。立体图上视差图的典型问题区域是对象边缘阴影区域纹理区域,这取决于视差图的计算方式。 您可以检查this tutorial,其中一种类型的后过滤应用于BM视差算法。

“学习OpenCV”是一本好书,您从书中引用可以清楚地回答您的问题。

结果是在大小不一的局部区域(我们称为斑点)中产生的结果。

Example disparity map without filtering and with it

我从the question at answers.opencv.org拍摄了一张照片。

斑点是一个区域,在计算的视差之间存在巨大差异,应将其视为噪声(并已过滤)。而且斑点可能会出现在问题区域。

之所以要手动设置与散斑相关的算法参数,是因为该参数将在不同场景和设置之间变化很大。因此,没有speckleWindowSizespeckleRange的单个最佳选择可以满足任何开发人员的需求。您可以使用靠近相机的大物体(如图像上)或远离相机且靠近背景的小物体(鸟瞰道路场景中的汽车)等。因此,应设置适合您特定相机设置的参数(或如果相机设置可能有所不同,请为您的用户提供调整界面。 考虑手指周围和手掌内侧的区域。有斑点(特别是手掌内的区域)。在这种情况下,视差的差异是噪声,应进行过滤。选择非常大的speckleWindowSize(蓝色矩形)将导致丢失诸如手指之类的细小但重要的细节。最好选择较小的speckleWindowSize(红色矩形)和较大的speckleRange,因为视差变化似乎很大。