什么是深度相机,以及深度相机的分类和工作原理
深度相机是一种能够捕捉场景中物体的深度信息(即物体与相机之间的距离)的设备。与传统的二维相机不同,深度相机除了拍摄图像的颜色和亮度外,还能生成一个关于场景中每个像素距离相机的深度数据,通常称为“深度图”。
深度相机根据其工作原理和技术不同,可以分为几种主要类型,每种类型的深度捕捉方式和适用场景也有所不同。以下是常见的深度相机分类:
-
立体视觉相机(Stereo Vision Camera)
- 原理:通过两台或多台相机从不同角度拍摄同一场景,利用视差来计算每个像素的深度信息。通过对比两张图像中的相同点,计算出物体的三维空间位置。
-
结构光相机(Structured Light Camera)
- 原理:通过投射已知的光模式(如条纹、网格等)到物体表面,然后通过相机捕捉光模式的变形情况,基于变形计算出物体表面的深度信息。
-
时间飞行(ToF, Time-of-Flight)相机
- 原理:通过发射激光束并接收激光反射回来的时间来计算物体与激光发射器之间的距离。激光雷达一般具有高精度和较远的测距能力。
-
RGB-D相机
- 原理:RGB-D相机结合了传统的RGB相机(彩色图像)和深度传感器(如结构光或ToF)来同时捕捉场景的颜色和深度信息。D代表的是深度(Depth)。
Intel RealSense D435介绍
Intel RealSense D435 是 Intel 推出的一款高性能深度相机,属于 RealSense 系列产品的一部分。它结合了深度传感技术和 RGB 图像捕捉功能,广泛应用于机器人、增强现实(AR)、虚拟现实(VR)、计算机视觉、三维扫描等多个领域。Intel RealSense D435 是一款功能强大、性能均衡的深度相机,适用于许多计算机视觉、机器人、AR/VR 以及其他需要实时深度感知的应用。
-
工作原理
左右红外相机(接收器)分贝产生两幅也就是左侧和右侧ir灰度图像,中间红外点阵发射器(红外散斑)相当于补光灯,进而可以得到点云。红外点阵发射器强度可调,是否发射也可调,不打开也能测深度,只是效果不好。最右边的rgb相机用于采集彩色图片,最终可以将彩色视频流与深度流进行对齐。
- 左右红外相机(接收器)
- 红外灰度图像:RealSense D435 使用左右两个红外相机(IR 摄像头)来采集深度数据。由于它们相互间有一定的基线(距离),这使得系统能够通过比较图像中的视差来估算每个像素的深度信息。这些相机捕捉的图像通常是 灰度图像,即只包含深度信息,而不包含颜色信息。
- 视差计算:左右红外相机拍摄的图像之间的像素差异(视差)用于计算场景中物体的距离。通过对这两个图像中的相同特征点进行匹配,系统可以推算出每个点的深度,从而生成深度图。
- 红外点阵发射器(红外散斑)
- 功能:中间的 红外点阵发射器 通常用于生成 红外光散斑,这是一种已知模式的红外光,通过投射到物体表面,辅助深度计算。点阵发射器的作用类似于一种 补光灯,在低光或无光环境下帮助相机更好地捕捉深度数据。
- 点云生成
- 点云(Point Cloud):通过左右红外相机捕获的深度数据和红外点阵发射器的辅助光源,RealSense D435 可以生成一个 三维点云,这个点云表示了物体的三维空间坐标,通常每个点都具有 (x, y, z) 坐标,且与场景中的物体表面相对应。
- 点云数据:这个三维点云数据可以用于物体识别、三维建模、环境扫描、手势识别等各种高级视觉任务。
- RGB相机
- 彩色图像采集:最右侧的 RGB 相机 负责采集场景的 彩色图像。RGB 摄像头和红外传感器(立体视觉和红外点阵发射器)配合工作,通常会提供 彩色视频流,并与深度流进行对齐,得到 彩色深度图。这个过程可以通过硬件或软件实现图像与深度信息的 对齐(alignment),即将每个深度图中的点与对应的彩色像素匹配。
- 左右红外相机(接收器)
windows中如何使用Intel RealSense D435
https://github.com/IntelRealSense/librealsense/blob/master/doc/distribution_windows.md
可视化界面(Intel RealSense Viewer)的安装以及SDK的安装可以参照官方指南。装SDK会附带安装可视化界面Viewer、Examples和Depth Quality Tool。
只用装一个SDK就行,会自动给你装上可视化viewer和tool
点下一步下一步就行。安装完成后就可以看到深度图和彩色图
在python中调用深度相机
-
首先在windows下安装anaconda和pycharm,然后配置open3d新环境。(这个自己找资源配置)
-
创建一个新的环境,python 版本按你的需求,我的是3.11
conda create -n 你的环境名字 python=3.11
-
配置opencv环境,安装opencv,我这里都下的最新的包
pip install opencv-python pip install opencv-contrib-python
-
接着安装open3d和pyrealsense2,open3d需要等很长时间。
pip install open3d pip install pyrealsense2
-
之后我们就需要把Intel RealSense D435的包下的 SDK 文件复制到我们的环境下,我这里SDK文件所在是 :D:\A_My_Project\robot\deep_camera\Intel RealSense SDK 2.0\bin\x64,然后把pyd和dll文件(如图)复制到我们python环境下,D:\anaconda3\envs\cv\DLLs(这里是因为我们用的anconda创建的环境,如果是单独的python环境需要找到对应的目录下)。
-
打开pycharm即可测试,代码和效果如下:
import pyrealsense2 as rs import numpy as np import cv2 if __name__ == "__main__": # Configure depth and color streams pipeline = rs.pipeline() config = rs.config() config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 30) config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 30) # Start streaming pipeline.start(config) try: while True: # Wait for a coherent pair of frames: depth and color frames = pipeline.wait_for_frames() depth_frame = frames.get_depth_frame() color_frame = frames.get_color_frame() if not depth_frame or not color_frame: continue # Convert images to numpy arrays depth_image = np.asanyarray(depth_frame.get_data()) color_image = np.asanyarray(color_frame.get_data()) # Apply colormap on depth image (image must be converted to 8-bit per pixel first) depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET) # Stack both images horizontally images = np.hstack((color_image, depth_colormap)) # Show images cv2.namedWindow('RealSense', cv2.WINDOW_AUTOSIZE) cv2.imshow('RealSense', images) key = cv2.waitKey(1) # Press esc or 'q' to close the image window if key & 0xFF == ord('q') or key == 27: cv2.destroyAllWindows() break finally: # Stop streaming pipeline.stop()
你可以进这个github项目进行案例学习
github官网地址:https://github.com/IntelRealSense/
官方文档:https://dev.intelrealsense.com/docs/docs-get-started
官方API:https://intelrealsense.github.io/librealsense/python_docs/_generated/pyrealsense2.html#module-pyrealsense2