- RealSenseTM互动开发实战
- 王曰海 汤振宇 吴新天
- 837字
- 2025-03-27 02:04:46
2.4 I/O设备操作
SDK采集接口管理采集设备(如一个摄像头)操作。可以通过以下组件架构来访问采集接口及其内容:
1)每个SDK会话可能包含多个实现了采集接口的模块。例如,系统中可能存在针对不同类型摄像头的模块实现。
2)每个模块可能包含多个设备,可通过Enumerate Devices查看如何进行设备的枚举。
3)每个设备都有一组设备属性,可通过Get/Set Device Properties查看如何获取或设置设备属性。
4)每个设备可能包含多个流(音频或视频流),可通过Enumerate Streams查看如何进行流的枚举。
5)每个数据流可能包含多个配置,可通过Enumerate Stream Congurations查看如何进行枚举流配置。
1.枚举设备
一个SDK的会话可以包含多个采集模块,每个模块可以管理多个设备。可以使用QueryImpl函数来枚举每个采集模块,通过CreateImpl函数创建模块实例,并利用Query-Device函数获取设备的特定信息。参考Handler函数监听摄像头的变化事件。
例2-15示例了如何枚举视频采集设备。
例2-15 枚举视频采集设备
//会话是一个PXCMSession实例 PXCMSession.ImplDesc desc1=new PXCMSession.ImplDesc(); desc1.group=EnumSet.of(PXCMSession.ImplGroup.IMPL_GROUP_SENSOR); desc1.subgroup=EnumSet.of(PXCMSession.ImplSubgroup.IMPL_SUBGROUP_VIDEO_CAPTURE); for (int m=0;;m++) { PXCMSession.ImplDesc desc2=new PXCMSession.ImplDesc(); if (session.QueryImpl(desc1,m,desc2).isError()) break; System.printf("Module[%d]: %d%n", m, desc2.friendlyName); PXCMCapture capture=new PXCMCapture(); session.CreateImpl(desc2, capture); //输出所有设备信息 for (int d=0;;d++) { PXCMCapture.DeviceInfodinfo=new PXCMCapture.DeviceInfo(); if (capture.QueryDevice(d, dinfo).isError()) break; System.out.printf("Device[%d]: %d%n", d, dinfo.name); } capture.close(); }
2.获取/设置设备属性
可以通过Device接口成员函数获取和设置设备属性。例2-16展示了如何获得或设置设备属性。不推荐随意改变设备的设置,这样做可能会影响其他共享相同物理设备的应用程序。
例2-16 设置设备属性
//设备是一个PXCMCapture装置实例 //获取摄像头的彩色和深度视野 PXCMPointF32 color_fov=device.QueryColorFieldOfView(); PXCMPointF32 depth_fov=device.QueryDepthFieldOfView(); //关闭自动曝光和设置手动曝光 device.SetColorAutoExposure(false); device.SetColorExposure(0);
3.枚举流
每个SDK设备可能有多个数据流。流信息是DeviceInfo结构的一部分,可以使用QueryDeviceInfo函数获取流信息。例2-17展示了如何获取流信息。
例2-17 获取流信息
//设备是一个PXCMCapture装置实例 PXCMCapture.DeviceInfodinfo=new PXCMCapture.DeviceInfo(); device.QueryDeviceInfo(dinfo); if ((dinfo.streams.contains(PXCMCapture.StreamType.STREAM_TYPE_COLOR)) { System.out.printf("COLOR STREAM%n"); } if ((dinfo.streams.contains(PXCMCapture.StreamType.STREAM_TYPE_DEPTH)) { System.out.printf("DEPTH STREAM%n"); }
4.枚举流配置
每一个流可能有多个配置(颜色的格式、分辨率和帧速率)。可以使用QueryStreamPro-fileSet函数来枚举单个流或多个流的配置。通常多个流配置之间有一定的关联,例如红外流的配置可能与相应的深度流密切相关。当枚举多个流的配置时,QuerStreamProleSet函数返回所有有效流的配置组合。可以使用IstreamProleSetValid函数验证某些流配置。例2-18展示了如何枚举流配置。
例2-18 枚举流配置
//设备是一个PXCMCapture装置实例 EnumSet<PXCMCapture.StreamType> streams=EnumSet.of(PXCMCapture.StreamType.STREAM_TYPE_COLOR,PXCCapture.StreamType.STREAM_TYPE_DEPTH); for (int p=0;;p++) { PXCMCapture.Device.StreamProfileSet profiles=new PXCMCapture.Device.StreamProfileSet(); pxcmStatussts=device.QueryStreamProfileSet(streams, p, profiles); if (sts.isError()) break; System.out.printf("color[%d]: %dx%d%n", p, profiles.color.imageInfo.width, profiles.color.imageInfo.height); System.out.printf("color[%d]: %dx%d%n", p, profiles.color.imageInfo.width, profiles.color.imageInfo.height); }