英特尔realsense D400系列深度相机简易说明
序
本文仅针对D415,D435,D455以及D410相机使用,意图为简述realsense相机工作原理以及使用方式。
关于相机本身
正常来说,从正面看向realsense D400系列相机,可以在黑色的正面看见三个或四个开孔。这些开孔对应的是左右红外摄像头以及红外补光灯,最旁边的则是RGB摄像头。D415的最近工作距离为30cm,435/455暂时不明。Realsense的基本工作原理为基于双目摄像头的测距,但是疑似也可以通过红外补光灯的结构光进行测距。这也使得realsense拥有无与伦比的泛用性。强太阳光下结构光普遍失效时realsense仍然可以通过双目测距,而黑暗环境也可以使用红外补光进行双目测距或结构光测距,泛用性不可谓不广。
相机开发
使用realsense相机需要安装realsense SDK:下载地址戳这里,若使用python开发则需要pip install pyrealsense2
本文着重于python环境下realsense的开发使用。
python环境配置
首先着重确认python opencv,无特殊版本要求,只需要pip install opencv-python pyrealsense2
即可。
随后新建一个python文件即可开始开发
相机配置
首先import pyrealsense2 as rs,下文rs全部指代pyrealsense2
调用realsense时首先需要对深度视频流和RGB视频流进行配置,其中rs.stream.depth和rs.stream.color分别代表深度与彩色图像的配置,接下来是分辨率,彩色流最高支持1080p30,深度流最高支持720p90。
# 配置深度和颜色流
self.pipeline = rs.pipeline()
self.config = rs.config()
# 配置流的分辨率和格式
self.config.enable_stream(rs.stream.depth, 640, 480, rs.format.z16, 60)
self.config.enable_stream(rs.stream.color, 640, 480, rs.format.bgr8, 60)
随后启动视频流
# 启动流
self.profile = self.pipeline.start(self.config)
配置深度图像标尺,创建对齐对象
# 获取深度传感器的深度标尺
self.depth_sensor = self.profile.get_device().first_depth_sensor()
self.depth_scale = self.depth_sensor.get_depth_scale()
# 创建对齐对象(将深度框与彩色框对齐)
self.align_to = rs.stream.color
self.align = rs.align(self.align_to)
# 获取内参
self.intrinsics = None
# 保存内参(首次调用时)
if self.intrinsics is None:
self.intrinsics = color_frame.profile.as_video_stream_profile().intrinsics
而在设置完后,需要获取图像并且转为numpy数组方便opencv调用
# 等待一对连贯的帧
frames = self.pipeline.wait_for_frames()
# 对齐深度帧与颜色帧
aligned_frames = self.align.process(frames)
# 获取颜色帧
color_frame = aligned_frames.get_color_frame()
# 转换为numpy数组并返回
return np.asanyarray(color_frame.get_data())
接下来可以选择获取深度图像
"""
获取深度图像帧,并只显示指定深度范围内的内容
参数:
min_depth: 最小深度值(米)
max_depth: 最大深度值(米)
返回:
彩色映射的深度图像
"""
# 等待一对连贯的帧
frames = self.pipeline.wait_for_frames()
# 对齐深度帧与颜色帧
aligned_frames = self.align.process(frames)
# 获取对齐的深度帧
aligned_depth_frame = aligned_frames.get_depth_frame()
if not aligned_depth_frame:
return None
# 转换为numpy数组
depth_image = np.asanyarray(aligned_depth_frame.get_data())
# 将深度值转换为米
depth_in_meters = depth_image * self.depth_scale
# 创建掩码,只保留指定深度范围内的像素
mask = (depth_in_meters >= min_depth) & (depth_in_meters <= max_depth)
depth_image_masked = depth_image.copy()
depth_image_masked[~mask] = 0
# 深度图像的可视化
depth_colormap = cv2.applyColorMap(
cv2.convertScaleAbs(depth_image_masked, alpha=0.03),
cv2.COLORMAP_JET
)
return depth_colormap
或者直接选择获取像素点距离
"""
获取指定像素点的三维坐标和距离
参数:
x: 像素点的x坐标
y: 像素点的y坐标
返回:
包含三维坐标和距离的字典,或None(如果获取失败)
"""
# 等待一对连贯的帧
frames = self.pipeline.wait_for_frames()
# 对齐深度帧与颜色帧
aligned_frames = self.align.process(frames)
# 获取对齐的深度帧和颜色帧
aligned_depth_frame = aligned_frames.get_depth_frame()
color_frame = aligned_frames.get_color_frame()
if not aligned_depth_frame or not color_frame:
return None
# 保存内参(首次调用时)
if self.intrinsics is None:
self.intrinsics = color_frame.profile.as_video_stream_profile().intrinsics
# 检查坐标是否在有效范围内
color_image = np.asanyarray(color_frame.get_data())
if x < 0 or x >= color_image.shape[1] or y < 0 or y >= color_image.shape[0]:
print("像素坐标超出图像范围")
return None
# 获取深度值(米)
depth = aligned_depth_frame.get_distance(x, y)
if depth <= 0:
print("无法获取有效深度值")
return None
# 将像素坐标转换为三维坐标
depth_point = rs.rs2_deproject_pixel_to_point(self.intrinsics, [x, y], depth)
x3d, y3d, z3d = depth_point
return {
'x': x3d,
'y': y3d,
'z': z3d,
'distance': depth # z坐标与距离在这个场景下是相同的
}
结束程序时需要停止相机流并释放程序
"""停止相机流并释放资源"""
self.pipeline.stop()
以上就是建议的realsense使用方法
本文为晓风原创,未经允许请勿转载。