ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenCV 深度相机接入指南:VideoCapture、CAP_INTELPERC 常量与 Intel RealSense SDK 构建集成

OpenCV 深度相机接入指南:VideoCapture、CAP_INTELPERC 常量与 Intel RealSense SDK 构建集成 OpenCV 深度相机接入指南VideoCapture、CAP_INTELPERC 常量与 Intel RealSense SDK 构建集成【免费下载链接】opencvOpen Source Computer Vision Library项目地址: https://gitcode.com/GitHub_Trending/opencv31/opencv本文以 OpenCV 官方教程 intelperc.markdown 为核心讲解如何通过VideoCapture类接入 Intel® RealSense SDK 兼容的深度传感器如 Creative Senz3D 等硬件覆盖 CMake 构建开关WITH_LIBREALSENSE的配置方法、CAP_INTELPERC_*数据格式常量、grab()/retrieve()多流读取模式与set()/get()属性访问机制并结合 cap_librealsense.cpp 源码剖析底层的流配置、帧对齐与属性分发实现帮助读者独立完成深度相机在 OpenCV 项目中的集成。背景从 PerC SDK 到 RealSense SDK 的演进该教程的兼容性要求为OpenCV 4.5.5原作者为 Alessandro de Oliveira Faria。文档明确标注了一条重要提示Note: This tutorial is partially obsolete since PerC SDK has been replaced with RealSense SDK 注由于 PerC SDK 已被 RealSense SDK 取代本教程部分已过时也就是说早期文档中的“PerCPerceptual ComputingSDK”现已由Intel® RealSense SDK 2.0统一替代但 OpenCV 的 C API 保留了CAP_INTELPERC_*这一整套常量命名以保持向后兼容。文档的核心结论是兼容 Intel® RealSense SDK 的深度传感器其深度图、RGB 图像以及其他格式的采集数据都可以通过VideoCapture这一熟悉的统一接口来获取——开发者无需为每种 3D 相机单独学习一套 SDK 用法。前置步骤安装 RealSense SDK 并配置 CMake按文档给出的三步准备流程操作安装 Intel RealSense SDK 2.0即 librealsense 库需自行安装并放入系统的查找路径在 CMake 中设置WITH_LIBREALSENSE开关配置 OpenCV 对 Intel RealSense SDK 的支持。如果在安装目录中找到了 Intel RealSense SDKOpenCV 将链接 RealSense SDK 库CMake 配置日志中可看到状态项LIBREALSENSE构建 OpenCV。从源码结构看这一开关在根 CMakeLists.txt 中定义OCV_OPTION(WITH_LIBREALSENSE Include Intel librealsense support OFF VISIBLE_IF NOT WITH_INTELPERC VERIFY HAVE_LIBREALSENSE)这里有两个值得注意的实现细节该选项默认值为 OFF即不显式开启时不会编译 RealSense 支持VISIBLE_IF NOT WITH_INTELPERC表明它是与旧版WITH_INTELPERCPerC SDK互斥展示的——这也印证了文档中“PerC SDK 已被 RealSense SDK 取代”的说法。配置成功后构建状态摘要会输出版本信息见 CMakeLists.txtif(WITH_LIBREALSENSE OR HAVE_LIBREALSENSE) status( Intel RealSense: HAVE_LIBREALSENSE THEN YES (${LIBREALSENSE_VERSION}) ELSE NO)构建完成后在 CMake 输出中确认Intel RealSense: YES (版本号)即可确认该后端已启用。后端选择CAP_REALSENSE 与 CAP_INTELPERC在 videoio.hpp 的VideoCaptureApiFlags中定义了两个等价的捕获后端常量CAP_INTELPERC 1500, //! RealSense (former Intel Perceptual Computing SDK) CAP_REALSENSE 1500, //! Synonym for CAP_INTELPERC两者数值相同、互为同义词。文档示例统一使用CAP_REALSENSE而参考示例 videocapture_depth.cpp 中使用的是CAP_INTELPERC两者写法均可。VideoCapture 可获取的四种数据流VideoCapture针对深度传感器可获取以下数据每种数据对应一个独立的retrieve()通道标志来自深度发生器depth generator的数据常量类型含义CAP_INTELPERC_DEPTH_MAPCV_16UC1每个像素是 16 位整数取值表示物体到相机 XY 平面的距离笛卡尔深度CAP_INTELPERC_UVDEPTH_MAPCV_32FC2每个像素包含两个 0–1 范围的 32 位浮点值表示深度坐标到彩色坐标的映射CAP_INTELPERC_IR_MAPCV_16UC1每个像素是 16 位整数取值表示反射激光束的强度来自 RGB 图像发生器image generator的数据常量类型含义CAP_INTELPERC_IMAGECV_8UC3彩色图像这些常量在 videoio.hpp 中定义enum { CAP_INTELPERC_DEPTH_MAP 0, CAP_INTELPERC_UVDEPTH_MAP 1, CAP_INTELPERC_IR_MAP 2, CAP_INTELPERC_IMAGE 3 };实现层面的注意点从源码结构看当前 RealSense 后端的 retrieveFrame() 仅实现了CAP_INTELPERC_DEPTH_MAP、CAP_INTELPERC_IR_MAP与CAP_INTELPERC_IMAGE三个通道CAP_INTELPERC_UVDEPTH_MAP会落入default分支直接返回失败此外 IR 帧实际以CV_8UC1类型返回源自RS2_FORMAT_Y8灰度流与头文件注释中标注的CV_16UC1存在差异。编写代码时建议以实际retrieve()返回值和Mat类型为准做防御性检查。读取深度图单流模式operator获取深度图的最简方式是使用VideoCapture::operatorVideoCapture capture( CAP_REALSENSE ); for(;;) { Mat depthMap; capture depthMap; if( waitKey( 30 ) 0 ) break; }在单流模式下operator直接取出深度流depthMap即为CV_16UC1类型的深度图。多流读取grab()retrieve()组合需要同时获取深度图、彩色图像和红外图像时应使用VideoCapture::grab()抓取一帧再用VideoCapture::retrieve()按通道标志分别取回VideoCapture capture(CAP_REALSENSE); for(;;) { Mat depthMap; Mat image; Mat irImage; capture.grab(); capture.retrieve( depthMap, CAP_INTELPERC_DEPTH_MAP ); capture.retrieve( image, CAP_INTELPERC_IMAGE ); capture.retrieve( irImage, CAP_INTELPERC_IR_MAP); if( waitKey( 30 ) 0 ) break; }从 cap_librealsense.cpp 的grabFrame()实现可以看到底层流程每次grab()调用mPipe.wait_for_frames()阻塞等待一帧多流数据再经过mAlign.process()做对齐处理。构造函数中初始化了mAlign(RS2_STREAM_COLOR)即使用 RealSense 的rs2_align过滤器将深度流与红外流对齐到彩色流坐标系——这正是retrieve()能把同一帧的多路数据一次性取回、且各流之间像素坐标互相一致的关键。另外retrieveFrame() 在取回彩色帧时若检测到流格式为RS2_FORMAT_RGB8会自动执行cv::cvtColor(frame, frame, COLOR_RGB2BGR)保证返回给用户的始终是 OpenCV 约定的 BGR 顺序这一细节对后续与imshow、图像处理管线的对接很重要。属性访问set()/get()与发生器标志传感器有两类数据发生器——图像发生器和深度发生器因此需要两个发生器标志来指定set()/get()操作的目標CAP_INTELPERC_IMAGE_GENERATOR—— 图像发生器属性的访问标志CAP_INTELPERC_DEPTH_GENERATOR—— 深度发生器属性的访问标志。如果两个标志都未设置默认按深度发生器处理。文档给出的属性读写示例VideoCapture capture(CAP_REALSENSE); capture.set( CAP_INTELPERC_DEPTH_GENERATOR | CAP_PROP_INTELPERC_PROFILE_IDX, 0 ); cout FPS capture.get( CAP_INTELPERC_DEPTH_GENERATOR CAP_PROP_FPS ) endl;在 videoio.hpp 中这些标志与 RealSense 专属属性定义如下enum { CAP_PROP_INTELPERC_PROFILE_COUNT 11001, CAP_PROP_INTELPERC_PROFILE_IDX 11002, CAP_PROP_INTELPERC_DEPTH_LOW_CONFIDENCE_VALUE 11003, CAP_PROP_INTELPERC_DEPTH_SATURATION_VALUE 11004, CAP_PROP_INTELPERC_DEPTH_CONFIDENCE_THRESHOLD 11005, CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_HORZ 11006, CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_VERT 11007 }; enum { CAP_INTELPERC_DEPTH_GENERATOR 1 29, CAP_INTELPERC_IMAGE_GENERATOR 1 28, CAP_INTELPERC_IR_GENERATOR 1 27, CAP_INTELPERC_GENERATORS_MASK CAP_INTELPERC_DEPTH_GENERATOR CAP_INTELPERC_IMAGE_GENERATOR CAP_INTELPERC_IR_GENERATOR };从源码结构看属性分发逻辑在 getProperty() 中实现先用propIdx ~CAP_INTELPERC_GENERATORS_MASK剥离发生器高位掩码得到“纯净”属性号再根据掩码位分别路由到getImageGeneratorProperty()、getDepthGeneratorProperty()、getIrGeneratorProperty()或getCommonProperty()。各发生器目前可查询的属性包括CAP_PROP_FRAME_WIDTH、CAP_PROP_FRAME_HEIGHT、CAP_PROP_FPS深度发生器还额外支持CAP_PROP_INTELPERC_DEPTH_SATURATION_VALUE—— 返回sensor.get_depth_scale()深度比例因子CAP_PROP_INTELPERC_DEPTH_FOCAL_LENGTH_HORZ / VERT—— 返回深度流内参fx / fy。需要特别注意的是文档中capture.set(...)的用法对应的是旧版 PerC SDK 的行为从源码结构看当前 RealSense 后端的 setProperty() 实现为空操作直接返回false即运行期的动态属性设置在 RealSense 后端尚未生效流配置实际由构造函数中的默认配置决定。默认流配置构造时即启用的 VGA 三流cap_librealsense.cpp 的构造函数展示了打开相机时的默认流配置VideoCapture_LibRealsense::VideoCapture_LibRealsense(int) : mAlign(RS2_STREAM_COLOR) { try { rs2::config config; // Configure all streams to run at VGA resolution at default fps config.enable_stream(RS2_STREAM_DEPTH, 640, 480, RS2_FORMAT_Z16); config.enable_stream(RS2_STREAM_COLOR, 640, 480, RS2_FORMAT_BGR8); config.enable_stream(RS2_STREAM_INFRARED, 640, 480, RS2_FORMAT_Y8); mPipe.start(config); } catch (const rs2::error) { } }即深度流为 640×480 的Z16格式、彩色流为 640×480 的BGR8、红外流为 640×480 的Y8帧率均为设备默认值。这一默认配置解释了前文retrieve()各通道的数据类型Z16对应CV_16UC1深度图BGR8对应CV_8UC3彩色图Y8对应CV_8UC1红外灰度图。若构造时设备不支持该配置rs2::error会被静默捕获isOpened()将返回false——因此示例代码中普遍建议先检查capture.isOpened()。完整示例samples/cpp/videocapture_depth.cpp文档正文末尾指向的官方用法示例即 samples/cpp/videocapture_depth.cpp它演示了通过 OpenCV 从 3D 相机获取数据的完整流程并支持 OpenNI、RealSense、Orbbec 三种相机类型的切换。程序通过CommandLineParser提供命令行参数{type t | | Camera Type: OpenNI, RealSense, Orbbec} {dist d | 400 | The minimum measurable distance in milimeter between the camera and the object} {help h | | Help}针对 RealSense 相机的核心处理流程对应文件 第 84–148 行else if (camType RealSense) { backend CAP_INTELPERC; flagDepth CAP_INTELPERC_DEPTH_MAP; flagBGR CAP_INTELPERC_IMAGE; flagIR CAP_INTELPERC_IR_MAP; } VideoCapture capture(backend); if(!capture.isOpened()) { std::cerr Fail to open depth camera. std::endl; return -1; } // ... if(capture.grab()) { if(capture.retrieve(depthMap, flagDepth)) { Mat colorDepthMap; colorizeDepth(depthMap, colorDepthMap); // normalize COLORMAP_JET imshow(Colorized Depth Map, colorDepthMap); } if(capture.retrieve(bgrImage, flagBGR)) imshow(RGB Image, bgrImage); if(capture.retrieve(irImage, flagIR)) imshow(Infrared Image, irImage); }其中深度图可视化的做法值得借鉴对CV_16UC1深度图先normalize()归一化到 0–255再用applyColorMap(rgb, rgb, COLORMAP_JET)着色显示-ddist参数用于按基线与焦距计算最大视差b * F / minDistance仅在 OpenNI 相机的视差图模式下生效。运行方式先cmake开启示例再构建或使用官方预编译包./videocapture_depth --type RealSense小结与限制说明结合教程文档与源码使用 Intel RealSense SDK 兼容深度传感器时需要注意构建前提必须显式开启WITH_LIBREALSENSE默认 OFF且系统可找到 librealsense否则CAP_REALSENSE后端不存在兼容范围OpenCV 4.5.5教程中 PerC 相关表述已被 RealSense SDK 取代数据通道DEPTH_MAPCV_16UC1、UVDEPTH_MAPCV_32FC2当前后端未实现、IR_MAP实际以CV_8UC1返回、IMAGECV_8UC3BGR属性机制发生器标志CAP_INTELPERC_DEPTH_GENERATOR/CAP_INTELPERC_IMAGE_GENERATOR默认深度发生器CAP_PROP_INTELPERC_*属性11001–11007RealSense 后端的setProperty目前为空实现属性以只读查询为主对齐保证深度与红外流通过rs2_align对齐到彩色流坐标系多流数据可直接按像素一一对应。继续深入可参考的仓库文件videoio.hpp常量定义、cap_librealsense.cppRealSense 后端实现、videocapture_depth.cpp多相机示例同目录下还有 kinect_openni.markdown 与 orbbec_uvc.markdown 等相邻教程分别覆盖 OpenNI 与 Orbbec UVC 深度相机的接入方式。【免费下载链接】opencvOpen Source Computer Vision Library项目地址: https://gitcode.com/GitHub_Trending/opencv31/opencv创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表