OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
无匹配项
使用Orbbec 3D摄像头(UVC)

上一篇教程: 使用Orbbec Astra 3D摄像头
下一篇教程: 使用Creative Senz3D和其他兼容Intel RealSense SDK的深度传感器

原作者陈金岳
兼容性OpenCV >= 4.10

引言

本教程介绍基于UVC协议的Orbbec 3D摄像头。对于依赖OpenNI的较旧Orbbec 3D摄像头,请参考上一篇教程

与使用基于OpenNI的Astra 3D摄像头(需要使用OpenNI2 SDK构建OpenCV)不同,访问Orbbec UVC 3D摄像头不需要安装Orbbec SDK。通过使用cv::VideoCapture类,用户可以像使用USB摄像头一样获取3D摄像头的流数据。深度图和彩色图像的校准和对齐在内部完成。

操作说明

要使用OpenCV操作3D摄像头,您可以参考入门指南安装OpenCV。

注意:从4.11版本开始,Mac OS用户需要使用标志-DOBSENSOR_USE_ORBBEC_SDK=ON从源代码编译OpenCV才能使用摄像头

cmake -DOBSENSOR_USE_ORBBEC_SDK=ON ..
make
sudo make install

代码

代码解释

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()释放相机资源。

C++

  • 打开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

BGR和深度帧

C++

BGR、深度和深度到彩色帧

注意

Mac用户需要sudo权限才能执行代码。