用Visual c++在Windows Store应用中使用OpenCV



我正在尝试使用OpenCV库在我的Windows 8商店应用程序中使用c++/CX进行一些图像处理。我能够使用Visual c++ 2012构建OpenCV库,但当我打包我的应用程序并运行Windows应用程序认证工具包时,我得到几个错误,说OpenCV dll使用一些不受支持的Windows API。如何修复这些错误?

我已经为ARM建立了一个OpenCV的子集。

我首先获得了我感兴趣的子集,以便在x86上为Windows Store应用程序构建。在将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) )

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

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' (3rdpartyIlmImf包括包含'Win32'的文件名,请小心更改这些实例)
  • 对于所有项目,将<AppContainerApplication>true</AppContainerApplication>添加到全局属性组
  • 对于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。自由,winspool。自由,shell32。Lib和comdlg32。

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

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

在下面的#if块中:

if(WIN32 AND NOT MINGW)

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

但是以上步骤只适用于x86和x64版本的OpenCV。OpenCV使用的CMake工具还不支持ARM架构的Visual c++ 2012项目。这个bug正在跟踪这个问题。

更新

现在有一个CMake的端口,支持构建Windows商店和手机应用程序(包括8.0和8.1)。详情请看这里:http://cmakems.codeplex.com/

第二更新

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

我们正在为CMake的新手机和商店版本启用OpenCV。与此同时,你看过http://github.com/msopentech/openCV吗?这里有关于为WinRT构建OpenCV的说明

免责声明:我100%是OpenCV库的新手,今天刚开始探索这个,当我发现一些使用OpenCV围绕Azure认知视觉样本的示例应用程序时。

我唯一的目标就是看看"OpenCV是否支持UWP并与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都会工作,但至少这个测试是一个好兆头,我想在这里分享我的早期结果

相关内容

  • 没有找到相关文章

最新更新