3.4.2. C++代码解析¶
3.4.2.1. Case 0: 使用 opencv 做解码和数据预处理¶
在该示例程序中,我们首先对 sail::Engine、PreProcessor、PostProcessor 初始化。 其中,PreProcessor 中封装了 opencv 的 API。
// ... // sail Engine sail::Engine engine(bmodel_path, tpu_id, sail::SYSIO); // ... // preforward PreProcessor preprocessor(416, 416); // ... // postforward PostProcessor postprocessor(0.5); // ...然后,我们使用一个 while 循环来模拟真实的目标检测业务。
// ... // using opencv cap get video frame while (cap.read(frame)) { // ... // preforward preprocessor.processv2(input, frame); // ... // forward engine.process(graph_name); // ... // postforward include NMS auto result = postprocessor.process(output, output_shape[2], height, width);
3.4.2.2. Case 1: 使用 bm-ffmpeg 解码,使用 bmcv 做预处理¶
我们定义了 FFMpegFrameProvider 和 PreProcessorBmcv类,它们分别封装了 sail::Decoder(bm-ffmpeg), sail::Bmcv(bmcv)。
// ... PreProcessorBmcv preprocessor(bmcv, input_scale, 416, 416); PostProcessor postprocessor(0.5); // ... // bm-ffmpeg ele FFMpegFrameProvider frame_provider(bmcv, input_path, tpu_id); // sail bmcv ele sail::BMImage img0, img1; // ... // using bmcv-ele get frame while (!frame_provider.get(img0)) { // ... // preforward preprocessor.process(img0, img1); // ... // forward engine.process(graph_name); // ... // postforward include NMS auto result = postprocessor.process(output, output_shape[2], height, width);