标签:
sdk架构示意图:
C#中需要用的动态链接库文件:
位于文件夹:$(RSSDK_DIR)/bin/x64 或 $(RSSDK_DIR)/bin/win32 中
C++/C#层次体系(M表示托管Managed)。全模块化。
PXC[M]Session继承自PXC[M]Base,包含I/O模块、算法模块和其他接口执行模块。首先要通过静态函数CreateInstance创建session实例,然后通过该实例创建其他模块的实例。
public class PXCMSession : PXCMBase
{
...
public static PXCMSession CreateInstance();
public PXCMSenseManager CreateSenseManager();
...
}
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]SenseManager典型的使用流程:
创建实例PXCMSenseManager sm=PXCMSenseManager.CreateInstance();
配置组件。EnableXXX函数来激活模块sm.EnableStream(PXCMCapture.StreamType.STREAM_TYPE_COLOR,0,0);
控制运行流程,获取结果。根据线程模型,使用消息环或者事件回调传递数据。
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();
...
}
释放实例。完整过程:
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
标签:
原文地址:http://www.cnblogs.com/GaoXuexing/p/4493005.html