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

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

3天内不再提示

计算机视觉中的立体视觉和深度感知Python示例实现

新机器视觉 来源:小白玩转Python 2023-11-21 10:50 次阅读

人工智能和图像处理的迷人世界中,这些概念在使机器能够像我们的眼睛一样感知我们周围的三维世界中起着关键作用。和我们一起探索立体视觉和深度感知背后的技术,揭示计算机如何从二维图像中获得深度、距离和空间理解的秘密。

计算机视觉中的立体视觉和深度感知是什么?

立体视觉和深度感知是计算机视觉中的重要概念,旨在模仿人类从视觉信息中感知深度和三维结构的能力。它们通常用于机器人技术、自动驾驶汽车和增强现实等应用中。

立体视觉

立体视觉,也称为立体视或双目视觉,是一种通过捕获和分析稍微分开放置的两个或多个摄像头的图像来感知场景深度的技术,模仿了人眼的工作方式。

立体视觉背后的基本原理是三角测量。当两个摄像头(或“立体摄像头”)从稍微不同的视点捕获相同场景的图像时,生成的图像对称为立体对,其中包含两个图像中相应点的位置差异或差异。

通过分析这些差异,计算机视觉系统可以计算场景中物体的深度信息。靠近摄像头的物体将具有较大的差异,而远离摄像头的物体将具有较小的差异。

立体视觉算法通常涉及诸如特征匹配、差异映射和极线几何等技术,以计算深度图或场景的3D表示。

深度感知

计算机视觉中的深度感知是指系统能够从单个或多个2D图像或视频帧中理解和估计3D场景中物体的距离能力。

除了立体视觉外,深度感知可以使用其他方法实现,包括:

单眼线索:这些是可以在单个摄像头或图像中感知的深度线索。例如,透视、纹理梯度、阴影和遮挡等示例。即使在没有立体视觉的情况下,这些线索也可以帮助估算深度。

LiDAR(光探测与测距):LiDAR传感器使用激光束来测量场景中物体的距离,提供点云形式的精确深度信息。这些信息可以与视觉数据融合,以获得更准确的深度感知。

结构光:结构光涉及将已知图案投射到场景上,并分析该图案在场景中的物体上的变形。这种变形可用于计算深度信息。

飞行时间(ToF)摄像头:ToF摄像头测量光线从物体反射并返回到摄像头所需的时间。这些信息用于估算深度。

在计算机视觉应用中,深度感知对于障碍物避免、物体识别、3D重建和场景理解等任务至关重要。

计算机视觉中的立体视觉和深度感知组件

立体摄像头:立体视觉依赖于两个或多个相机(立体摄像头),这些相机相距已知的距离放置。这些相机从稍微不同的视点捕获相同场景的图像,模拟人眼感知深度的方式。

图像捕获:相机捕获场景的图像或视频帧。这些图像通常被称为左图像(来自左相机)和右图像(来自右相机)。

校准:为了准确计算深度信息,必须对立体摄像头进行校准。这个过程涉及确定摄像头参数,如内在矩阵、畸变系数和外在参数(摄像头之间的旋转和平移)。校准确保来自两个相机的图像能够正确进行校正和匹配。

校正:校正是应用于捕获的图像的几何变换,以对齐极线上的相应特征。这通过使差异更可预测来简化立体匹配过程。

立体匹配:立体匹配是在左图像和右图像之间找到对应点或匹配点的过程。用于计算每个像素的差异的像素值被称为差异,表示图像中特征的水平偏移。有各种立

体匹配算法可供选择,包括块匹配、半全局匹配和图割,用于找到这些对应点。

差异图:差异图是一幅灰度图像,其中每个像素的强度值对应于场景中该点的差异或深度。靠近相机的物体具有较大的差异,而远离相机的物体具有较小的差异。

深度图:深度图是通过使用已知的基线(相机之间的距离)和相机的焦距来从差异图中导出的。它计算每个像素的实际世界单位(例如米)的深度,而不是差异。

可视化:深度和差异图通常可视化,以提供场景的3D结构的可读人类表示。这些图可以显示为灰度图像,也可以转换为点云以进行3D可视化。

一些硬件:除了摄像头外,还可以使用深度感知摄像头(例如Microsoft Kinect、Intel RealSense)或LiDAR(光探测与测距)传感器等专用硬件来获取深度信息。这些传感器直接提供深度,无需立体匹配。

计算机视觉中的立体视觉和深度感知Python示例实现

import cv2
import numpy as np


# Create two video capture objects for left and right cameras (adjust device IDs as needed)
left_camera = cv2.VideoCapture(0)
right_camera = cv2.VideoCapture(1)


# Set camera resolution (adjust as needed)
width = 640
height = 480
left_camera.set(cv2.CAP_PROP_FRAME_WIDTH, width)
left_camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height)
right_camera.set(cv2.CAP_PROP_FRAME_WIDTH, width)
right_camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height)


# Load stereo calibration data (you need to calibrate your stereo camera setup first)
stereo_calibration_file = ‘stereo_calibration.yml’
calibration_data = cv2.FileStorage(stereo_calibration_file, cv2.FILE_STORAGE_READ)


if not calibration_data.isOpened():
print(“Calibration file not found.”)
exit()


camera_matrix_left = calibration_data.getNode(‘cameraMatrixLeft’).mat()
camera_matrix_right = calibration_data.getNode(‘cameraMatrixRight’).mat()
distortion_coeff_left = calibration_data.getNode(‘distCoeffsLeft’).mat()
distortion_coeff_right = calibration_data.getNode(‘distCoeffsRight’).mat()
R = calibration_data.getNode(‘R’).mat()
T = calibration_data.getNode(‘T’).mat()


calibration_data.release()


# Create stereo rectification maps
R1, R2, P1, P2, Q, _, _ = cv2.stereoRectify(
camera_matrix_left, distortion_coeff_left,
camera_matrix_right, distortion_coeff_right,
(width, height), R, T
)


left_map1, left_map2 = cv2.initUndistortRectifyMap(
camera_matrix_left, distortion_coeff_left, R1, P1, (width, height), cv2.CV_32FC1
)
right_map1, right_map2 = cv2.initUndistortRectifyMap(
camera_matrix_right, distortion_coeff_right, R2, P2, (width, height), cv2.CV_32FC1
)


while True:
# Capture frames from left and right cameras
ret1, left_frame = left_camera.read()
ret2, right_frame = right_camera.read()


if not ret1 or not ret2:
print(“Failed to capture frames.”)
break


# Undistort and rectify frames
left_frame_rectified = cv2.remap(left_frame, left_map1, left_map2, interpolation=cv2.INTER_LINEAR)
right_frame_rectified = cv2.remap(right_frame, right_map1, right_map2, interpolation=cv2.INTER_LINEAR)


# Convert frames to grayscale
left_gray = cv2.cvtColor(left_frame_rectified, cv2.COLOR_BGR2GRAY)
right_gray = cv2.cvtColor(right_frame_rectified, cv2.COLOR_BGR2GRAY)


# Perform stereo matching to calculate depth map (adjust parameters as needed)
stereo = cv2.StereoBM_create(numDisparities=16, blockSize=15)
disparity = stereo.compute(left_gray, right_gray)


# Normalize the disparity map for visualization
disparity_normalized = cv2.normalize(disparity, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)


# Display the disparity map
cv2.imshow(‘Disparity Map’, disparity_normalized)


if cv2.waitKey(1) & 0xFF == ord(‘q’):
break


# Release resources
left_camera.release()
right_camera.release()
cv2.destroyAllWindows()

注意:对于立体摄像头设置,需要进行摄像头校准,并保存校准数据在.yml文件中,将路径放入示例代码中。

应用

通过立体视觉和深度感知获得的深度信息可以用于各种计算机视觉应用,包括:

3D场景重建

物体检测和跟踪

机器人和车辆的自主导航

增强现实和虚拟现实

手势识别

限制

以下是一些主要的限制:

依赖于相机校准:立体视觉系统需要对所使用的摄像机进行精确的校准。准确的校准对于确保深度信息的正确计算至关重要。校准中的任何错误都可能导致深度感知不准确。

有限的视场范围:立体视觉系统的视场范围有限,基于两个摄像机之间的基线距离。这可能导致盲区或在两个摄像机视场之外的对象的感知困难。

没有纹理和特征的表面:立体匹配算法依赖于在左右图像中找到对应的特征。缺乏纹理或独特特征的表面,如光滑的墙壁或均匀的背景,可能难以准确匹配,导致深度估计错误。

遮挡:在场景中相互遮挡的对象可能会对立体视觉造成困难。当一个对象部分遮挡另一个对象时,确定被遮挡区域的深度可能会有问题。

有限的范围和分辨率:随着距离摄像机的增加,使用立体视觉感知深度的准确性会减小。此外,深度测量的分辨率随着距离的增加而减小,使远处物体的细节难以感知。

对光照条件敏感:光照条件的变化,如环境光的变化或阴影,可能会影响立体视觉的准确性。不一致的光照条件可能会使左右图像之间的对应关系难以找到。

计算资源:立体匹配算法可能需要大量计算资源,特别是在处理高分辨率图像或实时视频流时。实时应用可能需要强大的硬件来进行高效处理。

成本和复杂性:设置带有校准摄像机的立体视觉系统可能会昂贵且耗时。硬件要求,包括摄像机和校准设备,可能会成为某些应用的障碍。

透明或反光物体的不准确性:透明或高反射表面可能会导致立体视觉中的错误,因为这些材料可能不会以适合深度感知的方式反射光线。

动态场景:立体视觉假定在图像捕捉期间场景是静态的。在具有移动对象或摄像机运动的动态场景中,维护左右图像之间的对应关系可能会很具挑战性,导致深度估计不准确。

有限的户外使用:立体视觉系统在明亮阳光下的户外环境或缺乏纹理的场景中可能会遇到困难,如晴朗的天空。

总之,计算机视觉中的立体视觉和深度感知为机器与理解我们环境的三维丰富性互动打开了新的可能性。正如我们在本文中所探讨的,这些技术是从机器人和自动驾驶车辆到增强现实和医学成像等各种应用的核心。

编辑:黄飞

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

    关注

    26

    文章

    1226

    浏览量

    55831
  • 人工智能
    +关注

    关注

    1776

    文章

    43881

    浏览量

    230632
  • 立体视觉
    +关注

    关注

    0

    文章

    36

    浏览量

    9730
  • 计算机视觉
    +关注

    关注

    8

    文章

    1600

    浏览量

    45619
  • python
    +关注

    关注

    51

    文章

    4677

    浏览量

    83473

原文标题:计算机视觉中的立体视觉和深度感知及示例

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

收藏 人收藏

    评论

    相关推荐

    如何通过立体视觉构建小巧轻便的深度感知系统

    有多种 3D 传感器方案来实现深度感知系统,包括立体视觉相机、激光雷达和TOF(飞行时间)相机。每个选择都有其优缺点,其中,嵌入式深度
    的头像 发表于 08-23 16:45 1089次阅读
    如何通过<b class='flag-5'>立体视觉</b>构建小巧轻便的<b class='flag-5'>深度</b><b class='flag-5'>感知</b>系统

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

    实用化,不仅将成为工业检测、生物医学、虚拟现实等领域的关键技术,还有可能应用于航天遥测、军事侦察等领域。目前在国外,双目体视技术已广泛应用于生产、生 活。双目立体视觉计算机
    发表于 11-21 16:20

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

    将成为工业检测、生物医学、虚拟现实等领域的关键技术,还有可能应用于航天遥测、军事侦察等领域。目前在国外,双目体视技术已广泛应用于生产、生 活。双目立体视觉计算机
    发表于 11-21 16:22

    基于立体视觉的变形测量

    ` 本帖最后由 ketianjian 于 2016-3-3 10:01 编辑 关键词: 机器视觉;摄影测量;计算机视觉立体视觉;变形测量; 大家好!有一段时间没有跟大家分享交流机
    发表于 09-21 10:11

    双目立体视觉的运用

    四种:1、双目视觉导航、定位;2、三维重构;3、双目立体测量;4、空间三维立体跟踪。这些运用需求,其实很多项目上都有用到,如工业流水线上物体外形检测、表面缺陷等,如娱乐活动可以利用
    发表于 03-03 09:36

    请问计算机视觉深度学习要看什么书?

    计算机视觉深度学习,看这本书就够了
    发表于 05-21 12:43

    汇总 |计算机视觉系统学习资料下载 精选资料分享

    计算机视觉干货资料,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、姿态估计、多视图几何、多传感器融合等方向【计算...
    发表于 07-27 07:51

    深度学习与传统计算机视觉简介

    文章目录1 简介1.1 深度学习与传统计算机视觉1.2 性能考量1.3 社区支持2 结论3 参考在计算机视觉领域中,不同的场景不同的应用程序
    发表于 12-23 06:17

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

    双目立体视觉(BinocularStereoVision)是机器视觉的一种重要形式,因其可简单地利用左右摄像机的图像信息计算得到相机视野
    发表于 12-23 07:19

    图像处理基本算法-立体视觉

    立体视觉计算机视觉领域的一个重要课题,它的目的在于重构场景的三维几何信息。立体视觉的研究具有重要的应用价值,其应用包括移动机器人的自主导航系统,航空及遥感测量,工业自动化系统等。
    发表于 11-17 10:09 5217次阅读

    计算机视觉与机器视觉区别

     “计算机视觉”,是指用计算机实现人的视觉功能,对客观世界的三维场景的感知、识别和理解。
    的头像 发表于 12-08 09:27 1.2w次阅读

    使用双目立体视觉实现CCD测距系统设计的资料说明

    双目立体视觉测量是人类利用双眼获取环境三维信息的主要途径。随着计算机视觉理论的发展,双目立体视觉测量在工业测量中发挥了越来越重要的作用,具有广泛的适用性。 本论文的主要研究内容是基于双
    发表于 11-26 12:05 6次下载
    使用双目<b class='flag-5'>立体视觉</b><b class='flag-5'>实现</b>CCD测距系统设计的资料说明

    如何使用FPGA实现微型实时多目立体视觉机的设计

    本文给出一种实时计算场景稠密深度图的多目立体视觉机设计与实现方法。立体视觉机使用多个微型摄像机同步获取场景图像,采用图像修正、LoG滤波、多
    发表于 04-02 09:33 21次下载
    如何使用FPGA<b class='flag-5'>实现</b>微型实时多目<b class='flag-5'>立体视觉</b>机的设计

    边缘AI套件上的立体视觉深度感知

    电子发烧友网站提供《边缘AI套件上的立体视觉深度感知.zip》资料免费下载
    发表于 06-12 14:36 0次下载
    边缘AI套件上的<b class='flag-5'>立体视觉</b><b class='flag-5'>深度</b><b class='flag-5'>感知</b>

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

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