使用 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 才能使用这些相机:
cmake -DOBSENSOR_USE_ORBBEC_SDK=ON ..makesudo 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:
cmake -DOBSENSOR_USE_ORBBEC_SDK=ON -DORBBEC_SDK_VERSION=1 .. make -j sudo make install

本教程的代码如下所示。你也可以从 这里 下载。 代码见下方示例 本教程的代码如下所示。你也可以从 这里 下载。 代码见下方示例
Python
Section titled “Python”-
打开 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()检测键盘事件。如果按下了某个键,循环将中断,程序结束。 -
释放资源: 退出循环后,释放相机资源。
Python
Section titled “Python”- Mac 用户需要 sudo 权限才能执行代码。
- 固件:如果你使用的是 Orbbec UVC 3D 相机,请确保相机的固件已更新到最新版本,以避免潜在的兼容性问题。更多详细信息,请参阅 Orbbec 的发布说明。