首页 > 解决方案 > 如何在 Qt 中部署 openvino-opencv

问题描述

我想在基于 Qt ( Qt5.7.1) 的项目中使用 openvino-opencv。我已经按照 windows10 https://docs.openvinotoolkit.org/latest/_docs_install_guides_installing_openvino_windows.html#Configure_MO中的说明下载并安装了 openvino411(对应于 opencv411)。我编写了一个.pri文件来在 Qt 中部署 opencv:

INCLUDEPATH += C:/openvino-411/openvino_2019.2.275/opencv/include

CONFIG(release, debug|release):{
    LIBS += -LC:/openvino-411/openvino_2019.2.275/opencv/lib \
            -lopencv_core411 -lopencv_highgui411 -lopencv_imgproc411 -lopencv_imgcodecs411 -lopencv_features2d411 -lopencv_ml411 -lopencv_objdetect411 -lopencv_dnn411
}
CONFIG(debug, debug|release):{
    LIBS += -LC:/openvino-411/openvino_2019.2.275/opencv/lib \
            -lopencv_core411d -lopencv_highgui411d -lopencv_imgproc411d -lopencv_imgcodecs411d -lopencv_features2d411d -lopencv_ml411d -lopencv_objdetect411d -lopencv_dnn411d
}

但似乎 opencv 无法在 Qt 中运行,因为我尝试运行 qt 程序。弹出的 cmd 窗口直接转到“ Press <RETURN> to close this window...”,实际上没有做任何事情。

标签: qtopencvopenvino

解决方案


首先,请记住 OpenVINO for windows 是针对 MSBUILD 而不是 MinGW 编译的,因此如果您的 Qt 项目是使用 MinGW 编译的,OpenVINO 预建库可能会在链接期间失败

也就是说,我成功地将 OpenVINO 推理引擎与 OpenCV 集成到一个大型且已经存在的基于 Qt 的项目(QT 5.13.1)中,在 LINUX(Ubuntu 16.04)下,它显示在 Windows 下,依赖项碎片使得它更难

这种配置非常棘手,并且还在进行中(对我而言),我正在尝试完全隔离 OpenVINO 依赖项,旨在将它们完全嵌入我们的应用程序中,无论如何它都可以工作:

首先,我安装了 OpenVINO ( https://docs.openvinotoolkit.org/latest/_docs_install_guides_installing_openvino_linux.html ) 特别注意按照描述的每一步,

也不要错过运行两个示例 demo_security_barrier_camera 和 demo_squeezenet_download_convert_run,它们将生成两个库 libcpu_extension.so 和 libgflags_nothreads.a 如果没有哪个 OpenVINO 将无法在您的项目下工作,我不知道以这种方式制作的原因

我在我的项目 (ThirdPartyLibraries/OpenVINOInferenceEngine) 的子文件夹下复制了以下库:

  • libinference_engine.so(在 OpenVINO 安装文件夹中找到:/opt/intel/openvino/inference_engine/lib/intel64/libinference_engine.so)
  • libtbb.so(在 OpenVINO 安装文件夹中找到:/opt/intel/openvino/inference_engine/external/tbb/lib/intel64/libtbb.so)

对于两个“cpu 扩展”库,我创建了一个名为“extension”的子文件夹,因此:

  • extension/libgflags_nothreads.a(在 OpenVINO Inference Engine Demo BUILD FOLDER 中找到,对我来说是 /home/myuser/inference_engine_demos_build/Release/lib/libgflags_nothreads.a)
  • extension/libcpu_extensio.so(在 OpenVINO Inference Engine Demo BUILD FOLDER 中找到,对我来说是 /home/myuser/inference_engine_demos_build/Release/lib/libcpu_extensio.so)

然后,我还将 Inference Engine 和 Lib Cpu Extension 的包含从它们各自的安装文件夹复制到了我的 ThirdPartyLibraries:

  • 在/opt/intel/openvino/inference_engine/include/下找到的所有内容都在/ThirdPartyLibraries/OpenVINOInferenceEngine/include下
  • 在/opt/intel/openvino/deployment_toos/inference_engine/src/extension/下找到的所有内容都在/ThirdPartyLibraries/OpenVINOInferenceEngine/extension/include下

最后,这是我的 Qt .pri 文件:

OPENVINODIR = /home/myuser/code_qt5_HG/Libraries/ThirdPartyLibraries/OpenVINOInferenceEngine

LIBS_OPENVINO  += -L$$OPENVINODIR \
                  -linference_engine \
                  -ltbb \
                  -L$$OPENVINODIR/extension \
                  -lcpu_extension

INCLUDES_OPENVINO  += $$OPENVINODIR/include \
                   += $$OPENVINODIR/extension/include

LIBS += $$LIBS_OPENVINO

INCLUDEEPATH += $$INCLUDES_OPENVINO

就是这样,这样做可以让我在我的项目中引用和使用推理引擎,如下所示:

 #include <ie_core.hpp>
 #include <ie_plugin_config.hpp>
 #include <cpp/ie_cnn_net_reader.h>
 #include <ext_list.hpp>

 .....

 InferenceEngine::Core ie;
 ie.AddExtension(std::make_shared<InferenceEngine::Extensions::Cpu::CpuExtensions>(), "CPU");
 InferenceEngine::CNNNetReader netReader;
 netReader.ReadNetwork(detectorXmlPath);
 netReader.getNetwork().setBatchSize(1);
 netReader.ReadWeights(detectorBinPath);
 InferenceEngine::InputsDataMap inputInfo(netReader.getNetwork().getInputsInfo());

 .....

要将我的应用程序部署到第三方机器上,我需要按照常规程序(https://docs.openvinotoolkit.org/latest/_docs_install_guides_installing_openvino_linux.html)在机器上安装 OpenVINO,并像往常一样部署我的应用程序,依赖项然后正确解决。

我的最后两分钱:我与英特尔直接联系,英特尔通过 OpenVINO 集成为我提供支持,据他们说“/deployment_tools/inference_engine/lib/intel64 中的所有 .so 文件,来自 /deployment_tools/inference_engine/external/ mkltiny_lnx/lib 和 /deployment_tools/inference_engine/external/tbb/lib 几乎是所有必需的依赖项”,我仍然没有时间确认


推荐阅读