官术网_书友最值得收藏!

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);
}
主站蜘蛛池模板: 新民市| 尉犁县| 隆尧县| 德格县| 台北市| 延吉市| 延津县| 平顺县| 怀宁县| 化州市| 揭西县| 麻栗坡县| 岢岚县| 江城| 平乡县| 来宾市| 成武县| 齐齐哈尔市| 萝北县| 娄烦县| 轮台县| 图们市| 涿州市| 台江县| 郓城县| 孝义市| 县级市| 山阴县| 西青区| 广南县| 建宁县| 成安县| 洞口县| 博客| 凤冈县| 漠河县| 井陉县| 漠河县| 广昌县| 广宁县| 吉安县|