国科网

2025-05-25 12:22:28  星期日
立足国科融媒,服务先进科技
计算机视觉中的立体视觉和深度感知及示例

点赞

0
发布时间:2023年11月21日 浏览量:280次 所属栏目:人工智能 发布者:田佳恬

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

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

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

立体视觉

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

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

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

立体视觉算法通常涉及诸如特征匹配、差异映射和极线几何等技术,以计算深度图或场景的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()

分享说明:转发分享请注明出处。

    热点图讯
    最新图讯
    相关图讯
    网站简介  |   联系我们  |   广告服务  |   监督电话
    本网站由国科网运营维护 国科网讯(北京)技术有限公司版权所有  咨询电话:010-88516927
    地址:北京市海淀区阜石路甲69号院1号楼1层一单元114
    ICP备案号:京ICP备15066964号-8   违法和不良信息举报电话:010-67196565
    12300电信用户申诉受理中心   网络违法犯罪举报网站   中国互联网举报中心   12321网络不良与垃圾信息举报中心   12318全国文化市场举报网站
    代理域名注册服务机构:阿里巴巴云计算(北京)有限公司