当前位置: 首页 > news >正文

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

一、立体视觉概述

        客观世界在空间上是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信息时,如果摄像机是固定的,只需一次标定即可。如果摄像机是运动的,则可能需多次标定。

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()

相关文章:

  • envoy开发调试环境搭建
  • 多线程轮流打印 ABC
  • SpringCloud整合spring security+ oauth2+Redis实现认证授权
  • 轻量级开源ROS 的机器人设备(一)
  • java基于微信小程序的校园报修系统 uniapp小程序
  • IDEA详细配置『JDK | Maven | Tomcat』
  • 视觉目标检测大模型套件detrex-调研
  • Docker搭建私有镜像仓库与WordPress
  • 嵌入式软件工程师面试题(七)
  • 力扣(412.516)补8.21
  • 数据集 | 基于计算机视觉的医学影像处理数据集
  • Apache RocketMQ 在阿里云大规模商业化实践之路
  • 《uni-app》一个非canvas的飞机对战小游戏实现-敌机模型实现
  • HTML生日快乐代码 html生日快乐网站制作 html烟花表白网站制作
  • 环境卫生学重点笔记
  • “大数据应用场景”之隔壁老王(连载四)
  • 230. Kth Smallest Element in a BST
  • 5、React组件事件详解
  • Codepen 每日精选(2018-3-25)
  • Docker入门(二) - Dockerfile
  • k个最大的数及变种小结
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • scrapy学习之路4(itemloder的使用)
  • ViewService——一种保证客户端与服务端同步的方法
  • 从输入URL到页面加载发生了什么
  • 浮动相关
  • 基于遗传算法的优化问题求解
  • 记一次用 NodeJs 实现模拟登录的思路
  • 前端相关框架总和
  • 如何胜任知名企业的商业数据分析师?
  • 如何在GitHub上创建个人博客
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 王永庆:技术创新改变教育未来
  • 问题之ssh中Host key verification failed的解决
  • 7行Python代码的人脸识别
  • kubernetes资源对象--ingress
  • 湖北分布式智能数据采集方法有哪些?
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • $.ajax中的eval及dataType
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (4)STL算法之比较
  • (a /b)*c的值
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • *1 计算机基础和操作系统基础及几大协议
  • .NET Framework 服务实现监控可观测性最佳实践
  • .net 程序发生了一个不可捕获的异常
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET 设计一套高性能的弱事件机制
  • .net 怎么循环得到数组里的值_关于js数组