0 something

sdk架构示意图:

C#中需要用的动态链接库文件:

  • C# interface DLL:libpxcclr.cs.dll
  • C++ P/Invoke DLL:libpxccpp2c.dll

位于文件夹:$(RSSDK_DIR)/bin/x64 或 $(RSSDK_DIR)/bin/win32 中

1 概念和流

C++/C#层次体系(M表示托管Managed)。全模块化。

PXC[M]Session

PXC[M]Session继承自PXC[M]Base,包含I/O模块、算法模块和其他接口执行模块。首先要通过静态函数CreateInstance创建session实例,然后通过该实例创建其他模块的实例。

public class PXCMSession : PXCMBase
{
    ...
    public static PXCMSession CreateInstance();
    public PXCMSenseManager CreateSenseManager();
    ...
}

PXC[M]SenseManager

PXC[M]SenseManager组织一个多模态管道(包括I/O设备和多个算法模块),控制管道的开始、停止、暂停、继续等等。CreateInstance创建SenseManager实例

public class PXCMSenseManager : PXCMBase
{
    ...
    public static PXCMSenseManager CreateInstance();
    ...
}

在内部,PXC[M]SenseManager通过PXC[M]CaptureManager来选择I/O设备和色彩/深度/声音流。

初始化管道时在PXC[M]SenseManager中取得PXC[M]CaptureManager的实例,可以用来强制设备搜索,以及设置录制和回放。然后取得PXC[M]Capture接口,可用来操作物理摄像头,如枚举设备/流,及查询流配置和设备属性。

管道运行过程中,可以通过PXC[M]Image接口,来获取I/O设备中就绪的samples,即图像缓存。

管道中可以包含算法模块,如PXC[M]HandModule手部追踪,PXC[M]FaceModule面部追踪,利用这些模块进行相应的设置和算法数据查询。

PXC[M]AudioSource接口获取声音。特定的语音特征直接在模块接口中,如PXC[M]SpeechRecognition

An SDK session is the context that holds these modules. 应用程序中可以创建一个或多个sdk sessions,每个session维护自己单独的I/O和算法模块context。模块的生命周期由session的使用决定。PXCMSession在其它模块创建前创建,在其它模块销毁后销毁。session必须是第一个创建,最后一个销毁。

C#托管实例内部指向C++非托管实例。

PXC[M]SenseManager是这种案例的主要接口:
(1)有一个或多个算法模块;
(2)一个摄像头;(多个摄像头的话可以建立多个实例)
(3)摄像头为算法模块提供数据;

 
 
 
摄像头
未处理数据
手部追踪
脸部追踪

理论上,应用程序可以同时独立地处理每个图像捕获和算法运行通道,每个通道都被赋予了一个模块ID:

  • 第一个图形通道用PXC[M]Capture.CUID,后续PXC[M]Capture.CUID+1
  • 算法通道用对应的标识符,如PXC[M]HandModule.CUID 或 PXC[M]FaceModule.CUID

PXC[M]SenseManager典型的使用流程:

  1. 创建实例
    PXCMSenseManager sm=PXCMSenseManager.CreateInstance();

  2. 配置组件。EnableXXX函数来激活模块
    sm.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_COLOR,0,0);

  3. 控制运行流程,获取结果。根据线程模型,使用消息环或者事件回调传递数据。

     sm.Init();
    
     for (;;) {
        pxcmStatus sts=sm.AcquireFrame(true); //AcquireFrame函数等待帧数据就绪
        if (sts<pxcmStatus.PXCM_STATUS_NO_ERROR)
            break;
    
        PXCMCapture.Sample sample;
        sample=sm.QuerySample(); //QuerySample获取图像
    
        .... // process image
    
        sm.ReleaseFrame(); //继续下一帧
     }
    
     sm.Close();
    
     pxcmStatus OnNewSample(int mid, PXCMCapture.Sample sample)
     {
         // return NO ERROR to continue,
         // or any ERROR to exit the loop
         return pxcmStatus.PXCM_STATUS_NO_ERROR;
     }
    
     void MainRoutine(PXCMSession session)
     {
     ...
         // Initialize my event handler
         PXCMSenseManager::Handler handler=
            new PXCMSenseManager.Handler();
         handler.onNewSample=OnNewSample;
    
         // Stream depth samples
         sm.Init(handler);
         sm.StreamFrames(true);
         sm.Close();
     ...
     }
    
  4. 释放实例。完整过程:

     PXCMSenseManager sm=PXCMSenseManager.CreateInstance();
     sm.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_COLOR,0,0,0);
     sm.Init();
    
     while (sm.AcquireFrame(true)>=pxcmStatus.PXCM_STATUS_NO_ERROR)
     {
         PXCMCapture.Sample sample=sm.QuerySample();
         .... // process image
         sm.ReleaseFrame();
     }
    
     sm.Dispose();
    

原始数据流捕获和处理(待续)

generated by haroopad