为Windows 10 IoT核心ARM(Raspberry Pi)编译OpenCV 3

Paw*_*wel 3 opencv arm windowsiot raspberry-pi3 windows-iot-core-10

使用Windows操作系统上托管的Visual Studio为Windows 10 IoT核心ARM(Raspberry Pi)编译OpenCV 3.*的最简单方法是什么?

我可以在其他contrib模块中使用DNN(深度神经网络)模块吗?

Paw*_*wel 5

我在Raspberry Pi 3上运行的Windows 10 IoT Core(10.0.16299.0)上尝试编译OpenCV 3.4.1,因此我决定与社区分享我的经验.

要求

您需要做的就是:

  • OpenCV来源(来自Github).opencv用于核心功能,opencv_contrib用于其他模块.
  • CMake-gui(这里)
  • 带有ARM工具集和Windows 10 SDK的Visual Studio.

我使用了最新的Visual Studio 2017(15.6.2).社区版就足够了.确保您具有所需的Visual Studio组件:

  • 适用于UWP的Windows 10 SDK(10.0.16299.0):C++
  • UWP的Visual C++运行时
  • ARM的Visual C++编译器和库

SDK版本显然应与目标OS平台版本匹配.截至今天它是10.0.16299.0.

组态

启动CMake-gui.选择存储OpenCV源代码(根路径)的位置以及构建位置(配置,临时和输出).单击配置.

CMake-gui初始窗口

在弹出窗口中,选择Visual Studio 15 2017 ARM作为生成器(工具集和体系结构版本),然后选择"指定交叉编译选项".

在此输入图像描述

提供:

  • Operaring系统:WindowsStore
  • 版本:10.0
  • 处理器:ARM

在此输入图像描述

成功生成(可能带有一些警告)将以"配置完成"消息结束并显示make选项.

查找OPENCV_EXTRA_MODULES_PATH选项并提供您opencv_contrib/modules文件夹的路径.

在此输入图像描述

再次单击" 配置"

现在,您可以选择要包含在构建中的模块.在我的配置中,我有:

  • 启用构建opencv-world单个库(BUILD_opencv_world)
  • 禁止建设测试和应用程序(BUILD_TESTS,BUILD_PERF_TESTS,BUILD_opencv_apps)
  • (可选)启用Raspberry Pi NEON和VFP3优化(ENABLE_VPF3=ON,ENABLE_NEON=ON).您可以使用Cmake中的"添加条目"(作为布尔值)添加它们,但目前有一些OpenCV会处理这些选项.

我不得不禁用 descriptor(BUILD_opencv_line_descriptor)和显着模块(BUILD_opencv_saliency)导致他们遇到Microsoft特定的__popcnt问题,这在ARM平台上不适用于MS编译器.

我使用了一个技巧来为Windows启用DNN模块.在/modules/dnn/CMakeList.txt中,您必须先评论三行:

#if(WINRT)
#  ocv_module_disable(dnn)
#endif()
Run Code Online (Sandbox Code Playgroud)

再次配置,然后单击Generate.在Visual Studio中打开项目(.SLN).

在此输入图像描述

默认项目是ALL_BUILD,这是要构建的项目.选择要构建的配置(发布或调试).请注意,导致的导入库(.lib)和dll(.dll)将具有不同配置的不同名称.

在此输入图像描述

而已!这些库可能链接到UWP应用程序(C++/CX)和ARM平台的库.

此外 - 您可以使用相同的过程为x64x86平台构建自己的配置:再次从Cmake-gui开始,选择不同的构建文件夹,在配置的第一步中选择Visual Studio 15 2017 x64x86作为您的生成器然后在交叉编译选项中相应地处理.配置过程的其余部分看起来是一样的.

要在Windows 10 IoT Core上进一步使用OpenCV,您可以查看Microsoft自己提供的示例,例如此处.