0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

双目立体视觉之块匹配视差图算法

新机器视觉 来源:AI公园 2023-05-31 10:14 次阅读

双目立体视觉的第二部分,视差图计算算法

大家好!欢迎来到立体视觉深度第二部分。我将简要解释块匹配算法。我假设您已经阅读了前一篇文章,如果你还没有读过,去读一下。

在第一篇文章中,我们分别拍摄了左右两幅图像,并对相机进行了校准。校准过程之后,我们有了立体图像,两张图像中相同的点在同一条线上,这意味着如果这一对图片种有一支笔,笔上的对应的点应该分别是(X1, Y)和(X2, Y),Y是行号,X1和X2的图像的列号。

a9551b3c-ff51-11ed-90ce-dac502259ad0.jpg

校正过的图像显示相同的P点。

在本例中,X1和x2之间的差异为我们提供了视差值。我们已经提到过,如果我们用左眼闭着看一个近距离的物体,反之亦然,位置根据睁眼的角度而变化。当物体距离越远,这种差别就越明显。这意味着如果视差值越小,物体越近。每个点都可以做这个操作,但是效率不高,因为:

这是一个很慢的过程。时间是宝贵的。

如果校正的不够好,每个点都不理想。

我们需要减少误差,在这种情况下,逐点处理不会有帮助。

这就是我们使用块匹配的原因。其中一些是使用光流(图像流),或减少图像大小,以使用更少的处理能力。第二点我简单提一下,如果你想了解更详细的信息,请查阅相关论文。

我们从左边的图像开始。使用左图不是强制的,我就是这么用的。太大的块会产生平滑的图像,太小的块会产生噪声。你都应该尝试一下,找到最佳值。在选择最左边的块之后,我们从左到右搜索,并尝试尽可能多地与右边的图像匹配。由于图像被校正过了,在一个轴上搜索就足够了。

a963ecfc-ff51-11ed-90ce-dac502259ad0.png

黑块是我们的待搜索块

a9853650-ff51-11ed-90ce-dac502259ad0.png

在一个轴上搜索,从左到右搜索

如何进行块匹配?有很多公式。大多数人用的是绝对差的和以及差的平方和。你可以研究一下相关的论文以及人们是如何使用它的。在这些方法中,较小的结果意味着非常相似。这将是我们选择的块的差异值。

a99e01da-ff51-11ed-90ce-dac502259ad0.png

绝对差和的例子

a9ad6440-ff51-11ed-90ce-dac502259ad0.png

左校正后的图像,右校正后图像,块匹配后的视差图。

既然我们已经介绍了基础知识,让我们查看一下代码。在块匹配之后,我使用了WLS(加权最小二乘)滤波器来获得更平滑和更接近的视差值,可以更好地代表图像。函数为:

defdepth_map(imgL,imgR):
"""Depthmapcalculation.WorkswithSGBMandWLS.Needrectifiedimages,returnsdepthmap(lefttorightdisparity)"""
#SGBMParameters-----------------
window_size=3#wsizedefault3;5;7forSGBMreducedsizeimage;15forSGBMfullsizeimage(1300pxandabove);5Worksnicely

left_matcher=cv2.StereoSGBM_create(
minDisparity=-1,
numDisparities=5*16,#max_disphastobedividableby16f.E.HH192,256
blockSize=window_size,
P1=8*3*window_size,
#wsizedefault3;5;7forSGBMreducedsizeimage;15forSGBMfullsizeimage(1300pxandabove);5Worksnicely
P2=32*3*window_size,
disp12MaxDiff=12,
uniquenessRatio=10,
speckleWindowSize=50,
speckleRange=32,
preFilterCap=63,
mode=cv2.STEREO_SGBM_MODE_SGBM_3WAY
)
right_matcher=cv2.ximgproc.createRightMatcher(left_matcher)
#FILTERParameters
lmbda=80000
sigma=1.3
visual_multiplier=6

wls_filter=cv2.ximgproc.createDisparityWLSFilter(matcher_left=left_matcher)
wls_filter.setLambda(lmbda)

wls_filter.setSigmaColor(sigma)
displ=left_matcher.compute(imgL,imgR)#.astype(np.float32)/16
dispr=right_matcher.compute(imgR,imgL)#.astype(np.float32)/16
displ=np.int16(displ)
dispr=np.int16(dispr)
filteredImg=wls_filter.filter(displ,imgL,None,dispr)#importanttoput"imgL"here!!!

filteredImg=cv2.normalize(src=filteredImg,dst=filteredImg,beta=0,alpha=255,norm_type=cv2.NORM_MINMAX);
filteredImg=np.uint8(filteredImg)

returnfilteredImg

你可以再这里:https://github.com/aliyasineser/stereoDepth检查项目。代码基本上就是在创建匹配器。OpenCV的文档很差(我添加了一些,但这只是冰山一角),但编码方面真的很容易。让我们来看看参数

minDisparity: 最小视差值。通常我们期望这里是0,但当校正算法移动图像时,有时需要设置。

numDisparities: 最大视差值,必须大于0,定义视差边界。

blockSize: 匹配块的块大小。推荐使用[3-11],推荐使用奇数,因为奇数大小的块有一个中心

P1 和 P2: 负责平滑图像,规则是P2>P1。

disp12MaxDiff: 视差计算的最大像素差。

preFilterCap:过滤前使用的值。在块匹配之前,计算图像x轴的一个导数,并用于检查边界[-prefiltercap, prefiltercap]。其余的值用Birchfield-Tomasi代价函数处理。

uniquenessRatio: 经过成本函数计算,此值用于比较。建议取值范围[5-15]。

speckleWindowSize: 过滤删除大的值,得到一个更平滑的图像。建议取值范围[50-200]。

speckleRange: 使用领域检查视差得到一个平滑的图像。如果你决定尝试,我建议1或2。小心,这个值会乘以16!OpenCV会这样做,所以你不需要自己去乘。

在代码中我们使用了SGBM。创建左右视差图,使用WLS滤波平滑优化图像。我还没有掌握这个,我用数值做了实验,所以我就不详细讲了。

代码:https://github.com/aliyasineser/stereoDepth可用于单目和立体摄像机标定,以及视差图计算。之后,你可以对结果做任何你想做的事。在我的项目中,我用它来检测前方是否有物体或距离太近,都是关于无人机的。你可以用你的想象力创造很多东西。

编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

原文标题:双目立体视觉 II:块匹配视差图计算

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    双目立体视觉三大算法原理及其代码实现

    双目立体视觉中常用的基于区域的局部匹配准则主要有图像序列中对应像素差的绝对值之和SAD(sum of absolute differences)、对应像素差的平方之和SSD(sum of squared differences)
    发表于 07-01 09:34 1250次阅读
    <b class='flag-5'>双目</b><b class='flag-5'>立体视觉</b>三大<b class='flag-5'>算法</b>原理及其代码实现

    快速有效提取浓密视差的方法

    互为最大来确定其余点的匹配关系。用该方法处理经过良好校正的图像对,在VC++环境下可实现浓密视差的快速提取。关 键 词 双目立体视觉; 图
    发表于 06-14 00:21

    双目立体视觉原理大揭秘(一)

    不同的处理即可。非常感谢CCAS双目视觉软件对我们研究解析的大力支持,关于这方面的内容可以去试试CCAS双目视觉软件,感兴趣的朋友可以去网上找找相关资料。事实上,双目立体视觉
    发表于 11-21 16:20

    双目立体视觉原理大揭秘(二)

    。基于双目立体视觉的三维重构其基本原理也是模拟人眼并利用空间几何模型推导出相应的算法来解决实际问题。本文以服装设计中关于人体轮廓还原案例做一说明。为了便于理解,本文仅说明案例中一个视角的双目
    发表于 11-21 16:22

    双目立体视觉的运用

    ` 本帖最后由 ketianjian 于 2016-3-3 09:38 编辑 双目立体视觉,这是一门有着广阔前景运用的学科,也是一种非常重要的机器视觉运用形式。通俗来讲,就是利用两台或者多台
    发表于 03-03 09:36

    LABVIEW能做双目立体视觉

    最近在做一个双目立体视觉项目,LABVIEW有模块吗,有哪位大神用LABVIEW做过
    发表于 01-13 19:44

    双目立体视觉在嵌入式中有何应用

    双目立体视觉(BinocularStereoVision)是机器视觉的一种重要形式,因其可简单地利用左右摄像机中的图像信息计算得到相机视野中物体相对于摄像机的深度信息使得该技术拥有广泛的应用前景
    发表于 12-23 07:19

    双目立体视觉中靶标的设计与识别

    0 引言    双目立体视觉测量是基于视差原理,由多幅图像获取物体三维几何信息的方法。在计算机视觉系统中,双目
    发表于 09-26 17:07 1098次阅读
    <b class='flag-5'>双目</b><b class='flag-5'>立体视觉</b>中靶标的设计与识别

    双目立体视觉传感器精度分析与参数设计

    根据双目立体视觉传感器三角立体视差模型,建立了结构参数误差的传递函数,分析了双目视觉传感器结构参数及其误差传递规律对传感器综合测量精度的影响,得出了结构参数的合理
    发表于 09-06 14:38 75次下载
    <b class='flag-5'>双目</b><b class='flag-5'>立体视觉</b>传感器精度分析与参数设计

    双目立体视觉三维测量原理

    双目立体视觉是基于视差,由三角法原理进行三维信息的获取,即由两个摄像机的图像平面和北侧物体之间构成一个三角形。一直两个摄像机之间的位置关系,便可以获得两摄像机公共视场内物体的三维尺寸及空间物体特征点的三维坐标。所以,
    的头像 发表于 04-11 14:32 2.3w次阅读
    <b class='flag-5'>双目</b><b class='flag-5'>立体视觉</b>三维测量原理

    双目主动立体视觉监测平台靶标编码标志点的设计与识别分析

    双目立体视觉测量是基于视差原理,由多幅图像获取物体三维几何信息的方法。在计算机视觉系统中,双目立体视觉
    的头像 发表于 12-29 08:50 4195次阅读

    双目立体计算机视觉立体匹配研究综述

    双目立体视觉技术具有成本低、适用性广的优点,在物体识别、目标检测等方面应用广泛,成为计算机视觉领域的研究热点。立体匹配双目
    发表于 04-12 09:47 3次下载
    <b class='flag-5'>双目</b><b class='flag-5'>立体</b>计算机<b class='flag-5'>视觉</b>的<b class='flag-5'>立体匹配</b>研究综述

    双目立体视觉的定义与理解

    总结一下,我们现在认识了三种制造立体视觉的方法,分别是视觉陷阱、全息投影和产生视差双目立体视觉这一有着广阔应用前景的学科,随着光学,电子
    的头像 发表于 10-31 15:20 2200次阅读

    双目立体视觉原理 HALCON的双目视觉系统研究

      立体视觉技术是机器人技术研究中最为活跃的一个分支,是智能机器人的重要标志。双目立体视觉是通过对同一目标的两幅图像提取、识别、匹配和解释,进行三维环境信息的重建。其过程主要包括视频捕
    发表于 07-19 14:18 0次下载

    关于双目立体视觉的三大基本算法及发展现状

    双目立体视觉一直是机器视觉研究领域的发展热点和难点,“热”是因为双目立体视觉有着及其广阔的应用前景,且随着光学、计算机科学等学科的不断发展
    的头像 发表于 08-25 17:28 1430次阅读
    关于<b class='flag-5'>双目</b><b class='flag-5'>立体视觉</b>的三大基本<b class='flag-5'>算法</b>及发展现状