计算机视觉 立体视觉极简一览

一、立体视觉概述

        客观世界在空间上是3-D的,所以对视觉的研究和应用从根本上说应该是3-D的。现有的大多数图像采集装置所获取的图像本身是在2-D平面上的,尽管其中可以含有3-D物体的空间信息。要从图像认识世界,就要从2-D图像中恢复3-D 空间信息,这里的关键是要测量出景物各个点与观察者(或任一个参考点)之间的距离,而立体视觉是解决这个问题的一种重要方法。

        立体视觉是从场景的多个 2D 视图中提取 3D 信息的过程。立体视觉用于高级驾驶员辅助系统 (ADAS) 和机器人导航等应用,立体视觉用于估计相机感兴趣对象的实际距离或范围。

        通过估计场景中点的相对深度,可以从一对图像(也称为立体对)中获得 3D 信息。这些估计在立体视差图中表示,该视差图是通过匹配立体对中的对应点来构建的。

二、图像中的3D信息

1、阴影

 2、纹理

 3、焦点

 4、运动

 5、其它

6、高级别的信息 

透视图
 被遮挡的轮廓

         类似大小的物体在远处看起来更小(这也是与透视有关)

三、立体视觉系统

 1、相机标定

        其目的是根据有效的成像模型,确定摄像机的内外部属性参数,以便正确建立空间坐标系中物点与它在图像平面上的像点之间的对应关系。在立体视觉中,常使用多个摄像机,此时对每个摄像机都要分别标定。在从2-D计算机图像坐标推导3-D信息时,如果摄像机是固定的,只需一次标定即可。如果摄像机是运动的,则可能需多次标定。

扫描二维码关注公众号,回复: 14536478 查看本文章

2、图像获取

        图像采集涉及空间坐标和图像属性两方面的问题。立体图像的获取是立体视觉的物质基础。立体图像最常用的是双目图像。近年也有许多方法采用多目图像,获取这些多目图像的摄像机(及对应的观察视点)可在一条直线上,也可在一个平面上,或甚至呈现立体分布的形式

3、特征提取

        立体视觉借助不同观察点对同一景物间的视差来帮助求取 3-D 信息(特别是深度信息)。如何判定同一景物在不同图像中的对应关系是关键的一步。解决该问题的方法之一是选择合适的图像特征以进行立体图像之间的匹配。这里说的特征是一个泛指的概念,主要抽象地指像素或像素集合的表达和描述。目前还没有一种获取图像特征的普遍适用理论,常用的匹配特征从小到大主要有点状特征、线状特征和区域特征等。一般来讲,大尺度特征含有较丰富的图像信息,所需数目较少,易于得到快速的匹配;但对它们的提取与描述相对复杂,定位精度也差。另一方面,小尺度特征本身的定位精度高,表达描述简单;但其数目常较多,而所含信息量却较少,因而在匹配时需要采用较强的约束准则和鲁棒的匹配策略。

4、立体匹配

        立体匹配是指根据对所选特征的计算来建立特征间的对应关系,从而建立同一个空间点在不同图像中的像点之间的关系,并由此得到相应的视差图像。立体匹配是立体视觉中最重要、最困难的步骤。当空间三维场景被投影为二维图像时,同一景物在不同视点下的图像中会有很大的不同,而且场景中的诸多变化因素,如光照条件、噪声干扰、景物几何形状和畸变、表面物理特性以及摄像机特性等,都被综合到单一的图像灰度值中。仅由这一灰度值确定以上诸多因素是十分困难的,至今这个问题还没有得到很好的解决。

5、3D信息恢复

        当通过立体匹配得到视差图像后,便可以进一步计算深度图像,并恢复场景中的3-D信息(第10章还将详细介绍其他3-D景物恢复方法)。影响深度距离测量精度的因素主要有数字量化效应、摄像机定标误差、特征检测与匹配定位精度等。一般来讲,深度测量精度与匹配定位精度成正比,并与摄像机基线(不同摄像机位置间的连线)的长度成正比。增大基线长度可以改善深度测量精度,但同时会增大图像之间的差异,景物被遮挡的可能性也更大,从而增加了匹配的困难程度。因此,要设计一个精确的立体视觉系统,必须综合考虑各个方面的因素,保证各个环节都具有较高的精度。

四、OpenCV计算立体图像的深度图

        主要是StereoBM_create函数。

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

imgL = cv.imread('Tsukuba_L.png', 0)
imgR = cv.imread('Tsukuba_R.png', 0)

stereo = cv.StereoBM_create(numDisparities=16, blockSize=15)
disparity = stereo.compute(imgL, imgR)

        显示结果,如果对于结果不满意,可以调整numDisparities和blockSize参数。

fig, ax = plt.subplots(ncols=3, nrows=1)
ax[0].imshow(imgL)
ax[1].imshow(imgR)
ax[2].imshow(disparity)
plt.show()

猜你喜欢

转载自blog.csdn.net/bashendixie5/article/details/127075247