Visual c++ 在带有Visual C的Windows应用商店应用程序中使用OpenCV++;

Visual c++ 在带有Visual C的Windows应用商店应用程序中使用OpenCV++;,visual-c++,opencv,windows-8,visual-studio-2012,cmake,Visual C++,Opencv,Windows 8,Visual Studio 2012,Cmake,我正在尝试使用C++/CX在我的Windows 8应用商店应用程序中使用该库进行一些图像处理。我能够使用Visual C++ 2012构建OpenCV库,但是当我打包应用程序并运行它时,我会发现几个错误,说明OpenCV DLL使用一些不支持的Windows API。如何修复这些错误?OpenCV使用CMake构建其源代码。下载OpenCV源代码后,在根文件夹中编辑文件CMakeLists.txt以包含以下两行: 添加定义(-DWINAPI\u FAMILY=WINAPI\u FAMILY\u应

我正在尝试使用C++/CX在我的Windows 8应用商店应用程序中使用该库进行一些图像处理。我能够使用Visual C++ 2012构建OpenCV库,但是当我打包应用程序并运行它时,我会发现几个错误,说明OpenCV DLL使用一些不支持的Windows API。如何修复这些错误?

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

添加定义(-DWINAPI\u FAMILY=WINAPI\u FAMILY\u应用程序) 添加定义(-D_UNICODE)

在以下#if块中:

如果(WIN32而非MINGW)

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

但上述步骤只有在OpenCV的x86和x64版本中才能成功。OpenCV所使用的CGOID工具还没有支持ARM架构的Visual C++ 2012项目。这一问题正在由政府进行跟踪

更新 现在有一个CMake端口支持构建Windows应用商店和手机应用程序(8.0和8.1)。详情如下:

第二次更新 下面的视频显示OpenCV在使用C++编写的Windows 10通用应用程序中工作:

我已经成功地为ARM构建了OpenCV的子集

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

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

OCV_OPTION(BUILD_PERF_TESTS   "Build performance tests"  ON  IF (NOT IOS AND NOT TARGET_METRO) )
我以这种方式关闭了视频输入、构建性能测试和构建测试。我还添加了Raman在TARGET_METRO开启时提到的定义:

if(TARGET_METRO)
    add_definitions(-DWINAPI_FAMILY=WINAPI_FAMILY_APP)
    add_definitions(-D_UNICODE)
endif()
然后,我继续使用CMake生成该项目的x86(VisualStudio11)版本,并开始尝试构建该项目。您将遇到许多问题,其中大部分与WinRT中缺少API有关。其中大多数是机械变化(例如,将
InitializeCriticalSection
替换为
InitializeCriticalSectionEx
)。我将这些更改包装在
#if WINAPI_FAMILY==WINAPI_FAMILY_APP
下,这样就不会影响非目标的METRO构建

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

您需要做的主要更改是:

  • 将所有vcxproj文件中的所有“Win32”更改为“ARM”(第三方\IlmImf包括包含“Win32”的文件名,请小心将这些实例更改回)
  • 对于所有项目,将
    true
    添加到全局属性组
  • 对于ZERO_CHECK项目,将ConfigurationType更改为“DynamicLibrary”而不是“Utility”(因为该Utility类型将无法生成)
  • 在项目级别添加以下内容(对于要为ARM生成的每个项目):

    
    假的
    安慰
    假的
    假的
    
  • 从Link:Additional选项中删除“/machine:X86”(如果在其中)

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

我们正在致力于使用CMake的新手机和商店构建来启用OpenCV。在此期间,你已经看过了。这有关于为WinRT构建OpenCV的说明。

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

我唯一的目标就是看看“OpenCV是否在UWP上得到支持,并与ARM一起工作”。我读了一些2015年以后的帖子和博客,他们让我觉得这是不可能的

然后我发现了这个样本:

并且可以确认它对我的基本测试有效,您可以在这里看到我的视频,使用OpenCV库运行UWP应用程序的ARM Pi 2:


<>不说这意味着OpenCV的所有工作都会有效,但至少这个测试是个好的信号,我想在这里分享我的早期结果。< / P>我会很乐意在你的ARM部分的C++ 2012项目上取得任何进展的时候留下评论。我即将创建一个针对Windows8(x86和ARM)的vision项目。我当然可以做到。现在我正在看这个bug:我刚刚看到了构建视频,用Visual C++ 2012构建Windows 8的Metro风格应用程序,在视频中的某个点,他使用了基于OpenCV的WINRT-SDK进行FACE检测。我没有从谷歌找到这个,但我想知道是否有一些arm opencv构建。我认识那个家伙。他在演示中使用了OpenCV的x86版本。基本上,他在OpenCV API之上使用C++/CX创建了一个精简的WinRT包装器。他还没有能够为ARM构建库。你是对的,这个术语令人困惑。Windows RT是ARM的一部分。但是当人们说Windows运行时API时,他们指的是Windows 8已经暴露的新API风格,那些可以从任何语言调用的API:C++、C的JavaScript。这家伙说WinRT组件时,他指的是后者,而不是ARM。它可以在x86上运行,而不是在ARM处理器上运行吗?是的,实际上,在x86上运行它需要做的工作更少。你可能只需按照所有步骤进行操作,直到我谈到我为使其在ARM上工作而进行的额外黑客攻击。现在似乎有一个半官方的OpenCV Windows RT端口:另一个免责声明:我在Microsoft担任VST的产品经理,但
<ItemDefinitionGroup>
  <ClCompile>
    <CompileAsWinRT>false</CompileAsWinRT>
  </ClCompile>
  <Link>
    <SubSystem>Console</SubSystem>
    <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
    <GenerateWindowsMetadata>false</GenerateWindowsMetadata>
  </Link>
</ItemDefinitionGroup>