3

我正在尝试使用OpenCV库在我的 Windows 8 Store 应用程序中使用 C++/CX 进行一些图像处理。我能够使用 Visual C++ 2012 构建 OpenCV 库,但是当我打包我的应用程序并运行Windows App Certification Kit时,我收到几个错误,指出 OpenCV DLL 使用了一些不受支持的 Windows API。如何修复这些错误?

4

4 回答 4

8

我已经设法为 ARM 构建了 OpenCV 的一个子集。

我首先获取了我有兴趣为 x86 中的 Windows 应用商店应用程序构建的子集。在将 CMake 指向 OpenCV 的源下载后,我使用 Visual Studio 11 生成器来配置 x86 项目。我在 CMake 中添加了一个名为 TARGET_METRO 的新构建选项,并使用它来进一步配置其他项目。

这让我可以关闭几个我不想构建的第 3 方组件,例如:

OCV_OPTION(BUILD_PERF_TESTS   "Build performance tests"  ON  IF (NOT IOS AND NOT TARGET_METRO) )

我以这种方式关闭了 WITH_VIDEOINPUT、BUILD_PERF_TESTS 和 BUILD_TESTS。我还添加了拉曼在 TARGET_METRO 开启时提到的定义:

if(TARGET_METRO)
    add_definitions(-DWINAPI_FAMILY=WINAPI_FAMILY_APP)
    add_definitions(-D_UNICODE)
endif()

然后我开始使用 CMake 生成项目的 x86 (Visual Studio 11) 版本,并开始尝试构建项目。您将遇到许多问题,其中大部分与 WinRT 中缺少 API 有关。其中大部分是机械变化(例如,换掉InitializeCriticalSectionInitializeCriticalSectionEx。我将这些更改包装在下面#if WINAPI_FAMILY == WINAPI_FAMILY_APP,这样它就不会影响非 TARGET_METRO 构建。

当需要为 ARM 构建时,我所做的是启动 CMake 并使用 Visual Studio 11 生成器生成一个新项目(在名为“ARM”的目录下),然后开始手动编辑生成的项目文件。

您需要进行的主要更改是:

  • 将所有 vcxproj 文件中的所有“Win32”更改为“ARM”(3rdparty\IlmImf 包括包含“Win32”的文件名,小心将这些实例改回来)
  • 对于所有项目,添加<AppContainerApplication>true</AppContainerApplication>到 Globals 属性组
  • 对于 ZERO_CHECK 项目,将 ConfigurationType 更改为“DynamicLibrary”而不是“Utility”(因为 Utility 类型将无法构建)
  • 在项目级别添加以下内容(对于您要为 ARM 构建的每个项目):

    <ItemDefinitionGroup>
      <ClCompile>
        <CompileAsWinRT>false</CompileAsWinRT>
      </ClCompile>
      <Link>
        <SubSystem>Console</SubSystem>
        <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
        <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
      </Link>
    </ItemDefinitionGroup>
    
  • 从链接中删除“/machine:X86”:附加选项(如果它在那里)

  • 从其他依赖项中删除 gdi32.lib、winspool.lib、shell32.lib 和 comdlg32.lib(ARM 不存在这些库)
于 2013-02-19T01:10:17.713 回答
4

OpenCV 使用 CMake 构建其源代码。下载 OpenCV 源代码后,在根文件夹中编辑文件 CMakeLists.txt 以包含以下两行:

add_definitions(-DWINAPI_FAMILY=WINAPI_FAMILY_APP) add_definitions(-D_UNICODE)

在以下 #if 块中:

如果(WIN32 而不是 MINGW)

通过这样做,您的库将只能访问 Windows 应用商店应用程序支持的 API。这可能意味着您将不得不修复一些构建错误(上周我尝试的时候并没有太多),但最终您的二进制文件将是 WACK 干净的。

但上述步骤仅适用于 OpenCV 的 x86 和 x64 版本。OpenCV 使用的 CMake 工具尚不支持用于 ARM 架构的 Visual C++ 2012 项目。此错误正在跟踪该问题。

更新

现在有一个支持构建 Windows Store 和 Phone 应用程序(8.0 和 8.1)的 CMake 端口。在此处查看详细信息:http: //cmakems.codeplex.com/

第二次更新

下面的视频显示了 OpenCV 在使用 C++ 编写的 Windows 10 通用应用程序中工作:http: //channel9.msdn.com/Events/Build/2015/3-82

于 2012-12-28T06:09:44.307 回答
0

我们正在努力使用 CMake 的新 Phone 和 Store 构建启用 OpenCV。与此同时,您是否查看过http://github.com/msopentech/openCV。这有关于为 WinRT 构建 OpenCV 的说明。

于 2014-07-31T16:30:17.303 回答
0

免责声明:我对 OpenCV 作为一个库是 100% 的新手,今天刚开始探索这个,当时我在 Azure Cognitive Vision 示例中发现了一些使用 OpenCV 的示例应用程序。

我唯一的目标是查看“UWP 是否支持 OpenCV 并与 ARM 一起使用”。我阅读了自 2015 年以来出现的大量帖子和博客,它们让我认为这是不可能的。

然后我找到了这个样本: https ://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CameraOpenCV

并且可以确认它适用于我的基本测试,您可以在此处查看我的 ARM Pi 2 运行 UWP 应用程序的视频,使用 OpenCV 库: https ://twitter.com/LyalinDotCom/status/982830053355470848

并不是说这意味着所有的 OpenCV 都能正常工作,但至少这个测试是一个好兆头,我想在这里分享我的早期结果。

于 2018-04-08T04:03:23.320 回答