数据流程介绍
为了方便用户理解数据结构在插件间传递的过程,下面以一张图片作为输入,结合代码详细阐述这一数据传递过程,其中用到的数据结构和函数声明参见API参考(C++)。
图1 数据结构传递流程图
- 新建一个存储输入图片的MxstDataInput变量,并通过ReadFile函数读取图片数据到dataBuffer变量。
MxStream::MxstDataInput dataBuffer; APP_ERROR ret = ReadFile("./test.jpg", dataBuffer);
- 新建一个流管理的MxStreamManager对象并初始化,然后加载pipeline文件。
MxStreamManager *mxStreamManager = new MxStream::MxStreamManager(); ret = mxStreamManager->InitManager(); string streamsConfig = "detection.pipeline"; //detection.pipeline文件中可以有一个或多个业务流 APP_ERROR ret = mxStreamManager->CreateMultipleStreams(streamsConfig); //统一按照处理多个业务流的方式处理
- 通过SendData函数传递输入数据到“图片获取”模块。
ret = mxStreamManager->SendData(streamName, inPluginId, dataBuffer); //streamName是pipeline文件中业务流的名称;inPluginId为输入端口编号,对应输入元件的编号
- 在各个插件的Process函数中处理数据流程。
- 接受上一个插件的buffer数据及挂载在buffer上的metadata数据。
MxpiFrame inputMxpiFrame = GetHostDataInfo(*mxpiBuffer); //若数据在Device侧,则调用GetDeviceDataInfo函数 MxpiMetadataManager mxpiMetadataManager(*mxpiBuffer); //新建一个Metadata管理器对象 shared_ptr<void> metadata = mxpiMetadataManager.GetMetadata("keyName"); //根据key名称拿到挂载在buffer上的metadata数据,keyName通常为上一个插件的插件名
- 业务逻辑处理。
DataProcess(inputMxpiFrame, metadata, outputMetadata); //插件内部实现的数据处理功能,如:解码,缩放,推理等 mxpiMetadataManager.AddMetadata("pluginName", outputMetadata); //挂载outputMetadata数据到buffer上,keyName通常为当前插件的插件名pluginName
- 发送buffer数据到下一个插件。
SendData(inPlugin, *mxpiBuffer); //调用MxPluginBase的SendData方法将数据发送到下一个插件
- 接受上一个插件的buffer数据及挂载在buffer上的metadata数据。
- 通过GetResult函数获取最后一个插件的输出结果。
MxStream::MxstDataOutput* output = mxStreamManager->GetResult(streamName, outPluginId); //outPluginId为输出端口编号,对应输出元件的编号。
父主题: 基础开发