Realsense

本文详细介绍如何组装RealSense相机,配合手机使用并连接到笔记本。涉及图像查看、超像素分割(SLIC算法)、RealSense功能调用、图像压缩、以及特征匹配(ORB算法)的详细步骤和原理。

使用说明:

1、组装拍摄三脚架与滑动条轨,将RealSense相机与手机一同装置在三脚架的滑动条轨上。
2、连接RealSense到笔记本电脑,不需任何配置即可直接适配设备。
3、打开PC端软件,调至Real Sense功能区并点击开始按键即可查看实时图像(包含RGB与RGB-D图像)。

软件部分具体操作如下:
本软件配合Real Sense开发、编写。程序主要实现的功能如图3所示:
在这里插入图片描述

图3 、程序主界面
该图为程序主界面,为了提高用户使用便捷性,我们将实现的功能进行分区域化,主要分为如上图的四个功能区,从左至右分别是图像查看与超像素分割区、Real Sense调用区、图像压缩区和特征匹配区。
1图像预处理
如图4所示为图像查看区,由上至下依次为:读取本地图片文件、放大、缩小、上一张、下一张、超像素分割功能。读取的本地图片可一次性读取多张,通过上一张和下一张来滚动查看。
在这里插入图片描述

图4、图像查看区主界面
运行主程序并选择图片查看选项卡后点击文件选取按键,即可得到如图5所示的文件选取弹窗,此时、按键分别为放大和缩小查看功能,往下的、 两个按键分别为“上一张”、“下一张”滚动查看图片功能,若选择的图像为单张图像则“上一张”、“下一张”按钮点击无效。
在这里插入图片描述

图5、文件选取
接下来对所选取的图像进行超像素分割时,如图6点击超像素按键后会弹出一个参数设置窗口,在输入参数后,程序的后台会将当前图像进行超像素分割。其中“超像素分割”功能调用了OpenCV库中的Slic算法进行处理,如图7所示。
在这里插入图片描述
图6、超像素分割参数设置
在这里插入图片描述

图7、超像素分割后的图像
2、RealSense调用
如图8所示为RealSense调用区主界面,功能键由上至下以此为:打开摄像头、保存当前图像(深度图与RGB图像)、摄像头画面停止,其中保存按键再次按下为停止保存,如果不按则为连续保存采集到的图像帧,以上三个功能键皆基于pyrealsense2库函数来实现。
在这里插入图片描述

图8、 RealSense功能调用区

在点击第一个按键后RealSense摄像头将会打开如图9所示,左边为RGB摄像头、右边为深度摄像头;点击第二个按键后摄像头将会启动图像保存直到再次按下才会停止保存,保存的图像为代码同级目录下的imgSave文件夹如图10所示,另外为了增强可操作性还设置了摄像头画面停止功能:点击最后一个按键摄像头的图像将会停止以方便查看,点击后画面将会再次复原。
在这里插入图片描述

图9、Real Sense启动图像采集在这里插入图片描述

图10、保存的RGB图像与深度图像
3、图像压缩
在点击主界面的第三个选项卡后,将会打开如图11所示的图像压缩的功能界面,该界面分为两个主要模块:原图像区(左)、压缩后图像区(右)。在选取本地图像后将会其显示到左边的显示区中,此时可使用缩放功能来查看图像;右边的则会将压缩后的图像进行显示,同时也有缩放功能进行查看以及保存功能来保存压缩后的图像。
在这里插入图片描述

图11、图像压缩区主界面

点击后选取本地文件后,顶端会分别显示所选取图像的宽度与高度值,也可点击、来进行缩放查看如图12所示,接下来在如图13所示的下拉列表选择压缩比(预设可供选择的压缩比有1:2, 1:3, 1:4,1:16),随后点击将会进行图像压缩如图14所示,同样也可点击右边的、来对压缩后的图像进行缩放查看,最后点击将会保存该压缩图像到项目同级目录的imgPressSave文件夹内,如图15所示。
在这里插入图片描述

图12、本地读取待压缩文件
在这里插入图片描述
图13、选取压缩比
在这里插入图片描述
图14、图像压缩
在这里插入图片描述
图15、保存压缩后的图像

4特征匹配
点击主界面的第四个功能区选项卡后,将会进入图像深度信息匹配功能区,该功能区主界面如图16所示:

图16、特征匹配功能区主界面
点击按键后将会出现本地图片选取的对话框,此时用户将依次选入两张待选取的两张图片,在界面的顶部会显示两张图片的保存绝对路径、匹配后的图像将会自动保存到项目同级目录的imgMatChing文件夹下如图17与图18所示:
在这里插入图片描述
图17、特征匹配后的图像
在这里插入图片描述

图18、匹配图像的保存
随后点击有右边的深度回归功能,程序后台会对超像素分割后图像进行深度回归效果图如图19所示:
在这里插入图片描述

图19、深度回归后效果图

算法部分

1、SLIC超像素分割算法
基于k均值聚类算法,并在此基础上进行改进。首先是初始化聚类中心,在图像内均匀的分配聚类中心。假设图片总共有 N 个像素点,预分割为 K 个相同尺寸的超像素,那么每个超像素的大小为N/ K ,则相邻聚类中心的距离(步长)近似为S=sqrt(N/K)。
其次是对聚类中心进行修正,在聚类中心的nn邻域内重新选择聚类中心(一般取n=3)。具体方法为:计算该邻域内所有像素点的梯度值,将聚类中心移到该邻域内梯度最小的地方。这样做的目的是为了避免聚类中心落在梯度较大的轮廓边界上,以免影响后续聚类效果。
然后, 在每个聚类中心周围的邻域内为每个像素点分配类标签(即属于哪个聚类中心)。和标准的k-means在整张图中搜索不同,SLIC的搜索范围限制为2S
2S,可以加速算法收敛。在此注意一点:期望的超像素尺寸为SS,但是搜索的范围是2S2S。
再而是距离度量。包括颜色距离和空间距离。对于每个搜索到的像素点,分别计算它和该种子点的距离。距离计算方法如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

其中,dc代表颜色距离,ds代表空间距离,Ns是类内最大空间距离,定义为Ns=S=sqrt(N/K),适用于每个聚类。最大的颜色距离Nc既随图片不同而不同,也随聚类不同而不同,所以我们取一个固定常数m(取值范围[1,40],一般取10)代替。最终的距离度量D’如下:
在这里插入图片描述

由于每个像素点都会被多个聚类中心搜索到,所以每个像素点都会有一个与周围聚类中心的距离,取最小值对应的聚类中心作为该像素点的聚类中心。
接下来是迭代优化。理论上上述步骤不断迭代直到误差收敛(可以理解为每个像素点聚类中心不再发生变化为止),实践发现10次迭代对绝大部分图片都可以得到较理想效果,所以一般迭代次数取10。
最后是增强连通性。经过上述迭代优化可能出现以下瑕疵:出现多连通情况、超像素尺寸过小,单个超像素被切割成多个不连续超像素等,这些情况可以通过增强连通性解决。主要思路是:新建一张标记表,表内元素均为-1,按照“Z”型走向(从左到右,从上到下顺序)将不连续的超像素、尺寸过小超像素重新分配给邻近的超像素,遍历过的像素点分配给相应的标签,直到所有点遍历完毕为止。

2、ORB特征匹配算法
图像的特征点可以简单的理解为图像中比较显著显著的点,如轮廓点,较暗区域中的亮点,较亮区域中的暗点等。ORB采用FAST(features from accelerated segment test)算法来检测特征点。这个定义基于特征点周围的图像灰度值,检测候选特征点周围一圈的像素值,如果候选点周围领域内有足够多的像素点与该候选点的灰度值差别够大,则认为该候选点为一个特征点。

得到特征点后我们需要以某种方式描述这些特征点的属性。这些属性的输出我们称之为该特征点的描述子(Feature DescritorS).ORB采用BRIEF算法来计算一个特征点的描述子。
BRIEF算法的核心思想是在关键点P的周围以一定模式选取N个点对,把这N个点对的比较结果组合起来作为描述子。
在这里插入图片描述

步骤:
1.以关键点P为圆心,以d为半径做圆O。
2.在圆O内某一模式选取N个点对。这里为方便说明,N=4,实际应用中N可以取512.
假设当前选取的4个点对如上图所示分别标记为:
在这里插入图片描述

3.定义操作T
在这里插入图片描述

其中IA表示点A的灰度。
4.分别对已选取的点对进行T操作,将得到的结果进行组合。
假如:
在这里插入图片描述

则最终的描述子为:1011
理想的特征点描述子应该具备的属性:
在现实生活中,我们从不同的距离,不同的方向、角度,不同的光照条件下观察一个物体时,物体的大小,形状,明暗都会有所不同。但我们的大脑依然可以判断它是同一件物体。理想的特征描述子应该具备这些性质。即,在大小、方向、明暗不同的图像中,同一特征点应具有足够相似的描述子,称之为描述子的可复现性。
当以某种理想的方式分别计算描述子时,应该得出同样的结果。即描述子应该对光照(亮度)不敏感,具备尺度一致性(大小 ),旋转一致性(角度)等。
ORB并没有解决尺度一致性问题,在OpenCV的ORB实现中采用了图像金字塔来改善这方面的性能。ORB主要解决BRIEF描述子不具备旋转不变性的问题。

<think> 我们正在讨论Intel RealSense相机(特别是D435/D435i型号)在Python环境中的使用,重点是与OpenCV和NumPy的配合。以下内容将涵盖安装、基础使用、深度流处理、点云生成以及常见问题解决。 ### 一、环境搭建与安装 #### 1. 安装依赖库 确保已安装以下Python库: ```bash pip install numpy opencv-python pyrealsense2 ``` - **常见安装问题**(如引用[4]所述): 若安装`opencv-python`时出现`ModuleNotFoundError: No module named 'skbuild'`,需先安装`scikit-build`: ```bash pip install scikit-build pip install opencv-python ``` #### 2. 验证RealSense硬件连接 运行以下代码检测设备: ```python import pyrealsense2 as rs # 检查已连接设备 context = rs.context() devices = context.query_devices() print(f"找到 {len(devices)} 台设备") for i, dev in enumerate(devices): print(f"设备 {i}: {dev.get_info(rs.camera_info.name)}") ``` ### 二、基础数据采集(深度+彩色) #### 1. 初始化相机并配置流 ```python import cv2 import numpy as np import pyrealsense2 as rs # 配置深度和彩色流 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) # 彩色流 # 启动流 pipeline.start(config) ``` #### 2. 实时捕获与显示 ```python try: while True: # 等待帧 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 # 转换为NumPy数组 depth_image = np.asanyarray(depth_frame.get_data()) color_image = np.asanyarray(color_frame.get_data()) # 深度图着色(便于可视化) depth_colormap = cv2.applyColorMap( cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET ) # 并排显示 images = np.hstack((color_image, depth_colormap)) cv2.imshow('RealSense', images) if cv2.waitKey(1) & 0xFF == ord('q'): break finally: pipeline.stop() cv2.destroyAllWindows() ``` ### 三、深度数据处理 #### 1. 获取任意点的深度值 ```python # 在循环中添加: x, y = 320, 240 # 图像中心点 depth_value = depth_frame.get_distance(x, y) print(f"中心点({x},{y})的深度值: {depth_value:.3f}米") ``` #### 2. 深度图对齐到彩色图 ```python # 在初始化后添加对齐器 align_to = rs.stream.color align = rs.align(align_to) # 在循环中替换frames获取方式: aligned_frames = align.process(frames) aligned_depth_frame = aligned_frames.get_depth_frame() color_frame = aligned_frames.get_color_frame() ``` > 对齐后,彩色图和深度图的像素位置一一对应,便于后续处理。 ### 四、生成点云 ```python # 创建点云对象 pc = rs.pointcloud() points = pc.calculate(depth_frame) # 获取顶点坐标 vtx = np.asanyarray(points.get_vertices()).view(np.float32).reshape(-1, 3) # 形如[N,3]的数组 # 保存为PLY文件 points.export_to_ply("pointcloud.ply", color_frame) ``` ### 五、使用相机预设(引用[3]) D435i可通过加载预设优化性能: ```python # 获取设备 device = pipeline.get_active_profile().get_device() # 加载"高精度"预设 advanced_mode = rs.rs400_advanced_mode(device) advanced_mode.load_json('HighAccuracyPreset.json') # 需下载预设文件 ``` > 预设文件可在[Intel官方文档](https://dev.intelrealsense.com/docs/d400-series-visual-presets)获取。 ### 六、故障排除 1. **设备未识别**: - 检查USB3.0连接(蓝色接口) - 更新固件:[固件更新工具](https://dev.intelrealsense.com/docs/firmware-releases) 2. **`pyrealsense2`导入错误**: - 确保安装的`pyrealsense2`版本与`librealsense` SDK匹配[^4] 3. **帧率不稳定**: - 降低分辨率(如从1280×720改为640×480) - 关闭红外流(若不需要) --- §§相关问题§§ 1. 如何用RealSense实现手势识别? 2. 如何校准RealSense相机的深度和彩色传感器? 3. RealSense点云数据如何与Open3D集成? 4. 多台RealSense相机同步采集的实现方法? </think> ### Intel RealSensePython中的使用详解 结合OpenCV和NumPy库,RealSense相机(如D435/D435i)可实现深度感知、三维重建等计算机视觉任务。以下是核心使用方法和典型应用场景: --- #### 一、环境配置要点 1. **安装依赖库**(解决引用[4]的报错) ```bash # 先安装基础编译工具 pip install scikit-build # 解决skbuild缺失问题 pip install --upgrade pip pip install opencv-python numpy pyrealsense2 ``` - 报错`ModuleNotFoundError: No module named 'skbuild'`需先安装`scikit-build`[^4] - 建议使用Python 3.7+兼容性最佳 --- #### 二、核心工作流程(结合OpenCV/NumPy) ##### 1. **初始化相机与流配置** ```python import cv2 import numpy as np import pyrealsense2 as rs # 创建管道和配置 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) # RGB流 # 启动设备 profile = pipeline.start(config) ``` ##### 2. **深度与彩色帧对齐** ```python # 创建对齐对象(将深度图对齐到彩色图坐标系) align_to = rs.stream.color align = rs.align(align_to) while True: frames = pipeline.wait_for_frames() aligned_frames = align.process(frames) # 对齐后的帧 depth_frame = aligned_frames.get_depth_frame() color_frame = aligned_frames.get_color_frame() # 转换为OpenCV格式 depth_image = np.asanyarray(depth_frame.get_data()) color_image = np.asanyarray(color_frame.get_data()) # 深度图可视化(伪色彩) depth_colormap = cv2.applyColorMap( cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET ) # 显示结果 cv2.imshow("RGB", color_image) cv2.imshow("Depth", depth_colormap) if cv2.waitKey(1) & 0xFF == ord('q'): break ``` ##### 3. **深度数据应用示例** ###### (1) 获取指定点深度值 ```python # 获取图像中心点深度(单位:米) x, y = 320, 240 depth_value = depth_frame.get_distance(x, y) print(f"中心点({x},{y})深度: {depth_value:.3f}米") ``` ###### (2) 3D坐标重建 ```python # 获取相机内参 intr = depth_frame.profile.as_video_stream_profile().intrinsics # 将像素坐标转为3D坐标 point_3d = rs.rs2_deproject_pixel_to_point(intr, [x, y], depth_value) print(f"3D坐标: X={point_3d[0]:.3f}, Y={point_3d[1]:.3f}, Z={point_3d[2]:.3f}") ``` --- #### 三、高级功能实现 ##### 1. **使用相机预设**(引用[3]) ```python device = profile.get_device() advanced_mode = rs.rs400_advanced_mode(device) # 加载高精度预设 preset_file = "HighAccuracyPreset.json" with open(preset_file, 'r') as f: json_str = f.read().strip() advanced_mode.load_json(json_str) # 应用预设 ``` > 预设文件需从[Intel RealSense Viewer](https://www.intelrealsense.com/sdk-2/)导出 ##### 2. **点云生成与保存** ```python pc = rs.pointcloud() points = pc.calculate(depth_frame) points.export_to_ply("pointcloud.ply", color_frame) # 保存彩色点云 ``` --- #### 四、性能优化技巧 1. **分辨率选择** - **精度优先**:使用848×480深度分辨率 - **速度优先**:使用640×360分辨率 2. **滤波增强** ```python # 添加深度图滤波 dec_filter = rs.decimation_filter() # 降采样 spat_filter = rs.spatial_filter() # 空间平滑 filtered_depth = spat_filter.process(dec_filter.process(depth_frame)) ``` --- #### 五、常见问题解决 1. **设备未识别**: - 检查USB3.0端口(蓝色接口) - 更新相机固件[^2] 2. **帧同步问题**: ```python # 启用硬件同步(多相机时) config.enable_device(device_id) config.enable_stream(rs.stream.depth, ..., rs.format.z16, 30, option=rs.option.inter_cam_sync_mode, value=1) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值