我正在尝试使用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都会工作,但至少这个测试是一个好兆头,我想在这里分享我的早期结果