使用Visual C++在Windows应用商店应用中使用OpenCV

Ram*_*rma 2 opencv cmake visual-c++ windows-8 visual-studio-2012

我正在尝试使用OpenCV库在我的Windows 8商店应用程序中使用C++/CX进行一些图像处理.我能够使用Visual C++ 2012构建OpenCV库,但是当我打包我的应用程序并运行Windows应用程序认证工具包时,我收到一些错误,说OpenCV DLL使用了一些不受支持的Windows API.我该如何解决这些错误?

And*_*ich 8

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

我开始得到我感兴趣的子集,用于在x86中构建Windows应用商店应用程序.在将CMake指向OpenCV的源代码下载之后,我使用Visual Studio 11生成器来配置x86项目.我在CMake中添加了一个名为TARGET_METRO的新构建选项,并使用它来进一步配置其他项目.

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

OCV_OPTION(BUILD_PERF_TESTS   "Build performance tests"  ON  IF (NOT IOS AND NOT TARGET_METRO) )
Run Code Online (Sandbox Code Playgroud)

我以这种方式关闭了WITH_VIDEOINPUT,BUILD_PERF_TESTS和BUILD_TESTS.当TARGET_METRO打开时,我还添加了拉曼提到的定义:

if(TARGET_METRO)
    add_definitions(-DWINAPI_FAMILY=WINAPI_FAMILY_APP)
    add_definitions(-D_UNICODE)
endif()
Run Code Online (Sandbox Code Playgroud)

然后我继续使用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"(因为实用程序类型将无法构建)
  • 在项目级别添加以下内容(对于要为ARM构建的每个项目):

    <ItemDefinitionGroup>
      <ClCompile>
        <CompileAsWinRT>false</CompileAsWinRT>
      </ClCompile>
      <Link>
        <SubSystem>Console</SubSystem>
        <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
        <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
      </Link>
    </ItemDefinitionGroup>
    
    Run Code Online (Sandbox Code Playgroud)
  • 从链接中删除"/ machine:X86":其他选项(如果它在那里)

  • 从其他依赖项中删除gdi32.lib,winspool.lib,shell32.lib和comdlg32.lib(ARM不存在这些库)