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);
}