Skip to content

使用 Orbbec 3D 相机(UVC)

本教程专门介绍基于 UVC 协议的 Orbbec 3D 相机。对于依赖 OpenNI 的较早期 Orbbec 3D 相机的使用,请参阅 前一篇教程。

与基于 OpenNI、需要 OpenCV 随 OpenNI2 SDK 一起编译才能使用的 Astra 3D 相机不同,通过 OpenCV 访问 Orbbec UVC 3D 相机无需安装 Orbbec SDK。使用 cv::VideoCapture 类即可从 3D 相机获取流数据,与使用 USB 相机类似。深度图与彩色图像的标定和对齐在内部完成。

要在 OpenCV 中使用 3D 相机,你可以参考 Get Started 来安装 OpenCV。

请注意,从 4.11 起,Mac OS 用户需要使用 -DOBSENSOR_USE_ORBBEC_SDK=ON 标志从源码编译 OpenCV 才能使用这些相机:

Terminal window
cmake -DOBSENSOR_USE_ORBBEC_SDK=ON ..
make
sudo make install

默认情况下,当启用 -DOBSENSOR_USE_ORBBEC_SDK=ON 时,会使用 OrbbecSDK v2(即 ORBBEC_SDK_VERSION 默认为 2);它支持整个 Orbbec Gemini 330 系列。

如果你需要 Orbbec Femto、Gemini2XL 或 Astra+ 等旧款相机,请使用 -DORBBEC_SDK_VERSION=1 标志切换到 OrbbecSDK v1:

Terminal window
cmake -DOBSENSOR_USE_ORBBEC_SDK=ON -DORBBEC_SDK_VERSION=1 ..
make -j
sudo make install

orbbec_uvc_python.jpg orbbec_uvc_cpp.jpg

本教程的代码如下所示。你也可以从 这里 下载。 代码见下方示例 本教程的代码如下所示。你也可以从 这里 下载。 代码见下方示例

  • 打开 Orbbec 深度传感器: 使用 cv.VideoCapture(0, cv.CAP_OBSENSOR) 尝试打开第一个 Orbbec 深度传感器设备。 如果相机打开失败,程序将退出并显示一条错误信息。

  • 循环抓取并处理数据: 在一个无限循环中,代码持续从相机抓取数据。orbbec_cap.grab() 方法尝试抓取一帧。

  • 处理 BGR 图像: 使用 orbbec_cap.retrieve(None, cv.CAP_OBSENSOR_BGR_IMAGE) 获取 BGR 图像数据。 如果成功获取,则使用 cv.imshow("BGR", bgr_image) 在窗口中显示 BGR 图像。

  • 处理深度图像: 使用 orbbec_cap.retrieve(None, cv.CAP_OBSENSOR_DEPTH_MAP) 获取深度图像数据。 如果成功获取,首先将深度图像归一化到 0 到 255 的范围,然后应用伪彩色,并使用 cv.imshow("DEPTH", color_depth_map) 在窗口中显示结果。

  • 键盘中断: 使用 cv.pollKey() 检测键盘事件。如果按下了某个键,循环将中断,程序结束。

  • 释放资源: 退出循环后,使用 orbbec_cap.release() 释放相机资源。

  • 打开 Orbbec 深度传感器: 使用 VideoCapture obsensorCapture(0, CAP_OBSENSOR) 尝试打开第一个 Orbbec 深度 传感器设备。如果相机打开失败,将显示一条错误信息,程序退出。

  • 获取相机内参: 使用 obsensorCapture.get() 获取相机的内参,包括焦距(fx、fy)和主点(cx、cy)。

  • 循环抓取并处理数据: 在一个无限循环中,代码持续从相机抓取数据。obsensorCapture.grab() 方法尝试抓取一帧。

  • 处理 BGR 图像: 使用 obsensorCapture.retrieve(image, CAP_OBSENSOR_BGR_IMAGE) 获取 BGR 图像数据。 如果成功获取,则使用 imshow("BGR", image) 在窗口中显示 BGR 图像。

  • 处理深度图像: 使用 obsensorCapture.retrieve(depthMap, CAP_OBSENSOR_DEPTH_MAP) 获取深度图像数据。 如果成功获取,则对深度图像进行归一化并应用伪彩色,然后 使用 imshow("DEPTH", adjDepthMap) 在窗口中显示结果。获取到的深度 值以毫米为单位,并被截断到 300 到 5000(毫米)之间的范围。 这一固定范围可以理解为基于深度相机深度范围的截断,用以去除深度图上的无效像素。

  • 将深度图叠加到 BGR 图像上: 将深度图转换为 8 位图像,调整大小以匹配 BGR 图像的尺寸,并以指定的透明度(alpha)将其叠加 到 BGR 图像上。叠加后的图像使用 imshow("DepthToColor", image) 在窗口中显示。

  • 键盘中断: 使用 pollKey() 检测键盘事件。如果按下了某个键,循环将中断,程序结束。

  • 释放资源: 退出循环后,释放相机资源。

  • Mac 用户需要 sudo 权限才能执行代码。
  • 固件:如果你使用的是 Orbbec UVC 3D 相机,请确保相机的固件已更新到最新版本,以避免潜在的兼容性问题。更多详细信息,请参阅 Orbbec 的发布说明。