【问题标题】:Using OpenCV in a Windows Store app with Visual C++在带有 Visual C++ 的 Windows 应用商店应用程序中使用 OpenCV
【发布时间】:2012-12-13 11:23:15
【问题描述】:

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

【问题讨论】:

标签: visual-c++ opencv windows-8 visual-studio-2012 cmake


【解决方案1】:

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

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

在下面的#if 块中:

如果(WIN32 AND NOT MINGW)

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

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

更新

现在有一个支持构建 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

【讨论】:

  • 如果您能在 ARM 部分的 C++ 2012 项目取得任何进展时发表评论,我会很高兴。我即将创建一个针对 Windows 8(x86 和 ARM)的视觉项目。
  • 我当然可以。现在我只是在看这个错误:cmake.org/Bug/view.php?id=13511
  • 我刚刚看到了构建视频,使用 Visual C++ 2012 构建 Windows 8 Metro 风格应用程序,在视频中的某个时间点,他使用了“用于 FaceDetection 的基于 OpenCV 的 WinRT SDK”。我没有从谷歌找到这个,但我想知道那里是否有一些 arm opencv 构建。
  • 我认识那个人。他在演示中使用了 OpenCV 的 x86 版本。基本上,他在 OpenCV API 之上使用 C++/CX 创建了一个瘦 WinRT 包装器。他还不能为 ARM 构建库。
  • 你说得对,这个术语令人困惑。 Windows RT 是 ARM 的一部分。但是当人们说 Windows Runtime API 时,他们指的是 Windows 8 所公开的新型 API,可以从任何语言调用的 API:C++、JavaScript 的 C#。这家伙说 WinRT 组件时,他指的是后者而不是 ARM
【解决方案2】:

我已经设法为 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 有关。其中大部分是机械更改(例如,将InitializeCriticalSection 替换为InitializeCriticalSectionEx)。我将这些更改封装在 #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”(因为实用程序类型将无法构建)
  • 在项目级别添加以下内容(对于您要为 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 不存在这些库)

【讨论】:

  • 是否可以在 x86 而不是 ARM 处理器上运行它?
  • 是的——在 x86 上你实际上需要做的工作更少。在我谈到我为使其适用于 ARM 所做的额外黑客攻击之前,您可能可以按照所有步骤进行操作。
【解决方案3】:

我们正在努力使用 CMake 的新电话和商店构建启用 OpenCV。与此同时,你看过http://github.com/msopentech/openCV。这有关于为 WinRT 构建 OpenCV 的说明。

【讨论】:

    【解决方案4】:

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

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

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

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

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

    【讨论】:

    • 还有一个免责声明:我在微软担任 VSTS 的产品经理,但这只是我探索各种有趣项目的业余爱好,这些都不是我的日常工作,也不代表我UWP 团队或此示例。我发现它像任何其他用户一样,搜索网络
    猜你喜欢
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    相关资源
    最近更新 更多