尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Windows 10 + VS2017 离线编译 OpenCV 4.5.2 全流程详解

Windows 10 + VS2017 离线编译 OpenCV 4.5.2 全流程详解 1. 项目概述与核心价值最近在帮几个刚入行计算机视觉的朋友配置开发环境发现一个挺普遍的问题很多教程要么版本太老要么步骤跳跃太大特别是对于网络环境受限、无法顺畅访问某些资源站点的朋友来说照着做很容易卡在下载或者配置环节。正好我自己最近在Windows 10上用Visual Studio 2017重新编译了OpenCV 4.5.2整个过程踩过一些坑也总结了一套比较稳的流程。这个组合Win10 VS2017 OpenCV 4.5.2虽然不算最新但非常经典和稳定对于学习、科研和很多工业项目来说完全够用而且整个编译过程不依赖任何特殊的网络访问方式所有资源都可以通过常规方式获取。这篇内容就是把这个过程掰开揉碎了讲清楚从准备工具到最终测试确保你跟着做一遍就能在自己的机器上把环境搭起来。简单来说我们要做的是从源代码构建OpenCV库。为什么不直接用官网提供的预编译包主要有几个原因一是预编译包可能不包含某些你需要但默认未启用的功能模块比如某些视频编解码器支持、深度神经网络模块的完整后端等二是预编译包的编译器版本和运行时库可能和你的项目不匹配导致一些诡异的兼容性问题三是自己编译可以针对你的CPU指令集进行优化获得更好的性能。当然自己编译最大的好处是可控和可定制你能清楚地知道你的OpenCV里都包含了什么。这个过程会用到CMake这个跨平台的构建工具它负责根据你的配置生成Visual Studio能识别的项目文件然后我们再在VS里完成编译。听起来步骤不少但别担心我会把每一步的意图和可能遇到的问题都讲明白。2. 环境与工具准备详解工欲善其事必先利其器。在开始编译之前我们需要把几样关键工具准备好。这个环节看似简单但工具版本的选择和安装路径的设置会直接影响到后续编译的顺利程度。2.1 核心工具清单与版本选择首先列一下我们需要的东西及其推荐版本操作系统Windows 10 64位。这是目前最主流的环境教程中的路径和设置都以Win10为例。集成开发环境Visual Studio 2017 Community版。选择VS2017是因为它和OpenCV 4.5.2的兼容性经过大量项目验证非常稳定。Community版对个人和开源项目免费功能完全足够。请注意安装时务必勾选“使用C的桌面开发”工作负载这会自动安装必要的C编译器和Windows SDK。构建生成工具CMake版本建议使用3.18以上但不要用太新的如3.27以避免可能的兼容性怪问题。我这里用的是CMake 3.24.1这是一个经过验证的稳定版本。源代码OpenCV 4.5.2 源代码包。我们将从GitHub的Release页面下载ZIP压缩包这是最直接可靠的方式。扩展模块OpenCV Contrib 4.5.2 源代码包可选但强烈建议。Contrib包含了许多官方核心库之外的有用模块比如人脸识别、文本检测、深度神经网络扩展DNN的更多层支持、AR增强现实相关功能等。如果你不确定是否需要可以先下载备用。注意版本一致性至关重要。OpenCV主源码包、Contrib扩展包以及后面可能用到的第三方库如FFmpeg其版本号必须严格对应。例如OpenCV 4.5.2必须搭配OpenCV Contrib 4.5.2混合使用不同版本会导致编译失败或运行时崩溃。2.2 具体下载与安装步骤Visual Studio 2017直接从微软官网下载安装程序。运行后在安装界面选择“使用C的桌面开发”右侧的安装详细信息可以默认也可以勾选“Windows 10 SDK”通常会自动包含。然后点击安装即可。这个过程可能需要一段时间取决于你的网速。CMake访问CMake官网的下载页面选择“Windows win64-x64 Installer”进行下载。安装过程很简单一路“Next”即可。有一个关键点在“Install Options”界面务必勾选“Add CMake to the system PATH for all users”或“Add CMake to the system PATH for current user”。这样我们就可以在命令行中直接使用cmake命令了方便很多。OpenCV源代码打开浏览器访问OpenCV在GitHub上的发布页面。找到版本“4.5.2”在“Assets”折叠栏下你会看到两个关键的ZIP文件opencv-4.5.2.zip主源码和opencv_contrib-4.5.2.zip扩展模块。分别点击下载。这两个文件加起来大约200MB通过浏览器直接下载即可无需借助其他工具。规划工作目录为了清晰我建议在某个盘符如D盘的根目录下创建一个专门的工作文件夹例如D:\opencv_build。然后在这个文件夹里再创建两个子文件夹D:\opencv_build\sources用于存放解压后的源代码。把刚才下载的opencv-4.5.2.zip和opencv_contrib-4.5.2.zip都解压到这里。解压后你会得到opencv-4.5.2和opencv_contrib-4.5.2两个文件夹。D:\opencv_build\build这是一个空文件夹它将作为我们的“构建目录”build directory。CMake生成的临时文件、解决方案文件以及最终的编译输出都会放在这里。务必保持“源码目录”和“构建目录”分离这是CMake推荐的最佳实践能让你的源码树保持干净。至此工具和源码就准备齐全了。你可以检查一下PATH环境变量打开命令提示符CMD输入cmake --version如果能正确显示版本号说明CMake安装配置成功。3. 使用CMake配置生成VS项目这是整个流程中最关键也最容易出错的一步。我们将使用CMake的图形化界面GUI工具来配置OpenCV的编译选项并生成Visual Studio 2017的解决方案文件.sln。3.1 启动CMake与基本路径设置首先从开始菜单找到“CMake (cmake-gui)”并启动它。界面主要分为上下两部分上半部分用于指定路径下半部分显示配置变量。指定源码路径在“Where is the source code:”输入框右侧点击“Browse Source...”然后导航到你解压OpenCV主源码的位置即D:\opencv_build\sources\opencv-4.5.2。选中该文件夹。指定构建路径在“Where to build the binaries:”输入框右侧点击“Browse Build...”然后导航到我们事先创建的空文件夹D:\opencv_build\build。选中该文件夹。3.2 关键配置选项解析点击左下角的“Configure”按钮。这时会弹出一个对话框让你选择“Generator”生成器。这是至关重要的一步在“Specify the generator for this project”下拉列表中选择“Visual Studio 15 2017”。注意下面还有一个“Optional platform for generator”选项如果你系统是64位请务必选择“x64”。这决定了你编译出来的是64位库还是32位库。对于现代应用64位是标准选择。选择好后点击“Finish”。CMake会开始第一次配置这个过程会分析你的系统环境检查编译器、依赖库等。配置完成后界面下半部分的列表会填充大量红色高亮的条目表示新值或待确认的值。现在我们需要关注并修改其中几个关键选项OPENCV_EXTRA_MODULES_PATH这是指定Contrib模块路径的。点击列表找到这一项可能在靠后的位置可以使用搜索框搜索“EXTRA”快速定位。双击其“Value”列或选中后点击右侧的“...”然后导航到Contrib模块的modules文件夹即D:\opencv_build\sources\opencv_contrib-4.5.2\modules。设置这个路径后CMake在下次配置时就会把Contrib里的模块也纳入构建范围。BUILD_opencv_world如果你希望将所有OpenCV的库如core, imgproc, highgui等打包成一个单独的opencv_world45.lib/.dll文件而不是几十个分散的小库可以勾选这个选项。这能极大简化项目链接时的配置只需要链接一个opencv_world45.lib即可。对于新手和大多数项目我推荐勾选它。但请注意如果你需要静态链接将库代码直接编译进你的exe或者你的项目依赖的某些第三方库与OpenCV的某个模块有符号冲突则不建议使用world模块。WITH_OPENGL、WITH_QT这些是可选GUI后端。默认的GUI后端是Win32 API。如果你计划使用OpenGL渲染或者Qt界面来显示图像可以勾选这些。但勾选它们通常意味着你需要提前安装好OpenGL开发库或Qt。对于初次编译为了减少复杂度建议先保持默认不勾选使用OpenCV自带的HighGUI模块基于Win32就足够了。OPENCV_ENABLE_NONFREE如果你需要使用一些受专利保护的算法例如SIFT、SURF特征点检测器需要勾选此项。请注意基于这些算法开发的商业应用可能需要考虑专利许可问题。CPU_BASELINE和CPU_DISPATCH这些是CPU优化选项。CPU_BASELINE指定了最低要求的CPU指令集默认是SSE3对于近十几年的CPU都支持。CPU_DISPATCH指定了在运行时如果检测到更高级的指令集如AVX2, AVX512可以动态分派到优化的代码路径。对于现代CPUIntel Haswell架构及以后或AMD推土机架构及以后你可以将CPU_BASELINE改为AVX2这能带来显著的性能提升。但编译出的库将无法在不支持AVX2的老CPU上运行。请根据你的目标部署环境决定。构建类型CMAKE_CONFIGURATION_TYPES在列表中搜索“CMAKE_CONFIGURATION_TYPES”你会发现它的值默认是Debug;Release;MinSizeRel;RelWithDebInfo。这对应了VS解决方案里的四种配置。我们主要关心Debug和Release。保持默认即可。安装路径CMAKE_INSTALL_PREFIX这个路径决定了执行“安装”后编译好的头文件、库文件等会被复制到哪里。默认路径可能类似C:\Program Files\OpenCV。我建议修改为一个没有空格和中文的简单路径例如D:\opencv_build\install。这样便于后续环境变量配置也避免因权限问题导致安装失败。3.3 处理下载错误与离线编译点击“Configure”后CMake会开始检查并自动下载一些第三方依赖库比如FFmpeg用于视频编解码、ippicvIntel性能原语库等。由于网络原因这个过程很容易失败表现为进度条卡住或出现下载错误Download: xxx FAILED。这就是“无需特殊网络访问方式”方案的核心我们采用离线包的方式。当CMake第一次配置后查看D:\opencv_build\build目录会发现一个名为CMakeDownloadLog.txt的文件里面记录了所有需要下载的文件及其URL。同时在D:\opencv_build\sources\opencv-4.5.2\.cache目录下会有一些以ippicv、ffmpeg等命名的子文件夹里面存放着下载缓存或占位文件。我们的策略是根据CMakeDownloadLog.txt中的URL通过浏览器直接访问这些链接手动下载对应的文件通常是.cmake脚本或压缩包。将这些下载好的文件按照CMakeDownloadLog.txt里指示的路径或者直接放到.cache目录下对应的文件夹里并确保文件名完全一致。再次点击CMake的“Configure”按钮。这次CMake检测到本地已有文件就会跳过下载直接使用。例如一个典型的ippicv文件可能叫ippicv_2020_win_intel64_20191018_general.zip。你手动下载后将其放入D:\opencv_build\sources\opencv-4.5.2\.cache\ippicv文件夹内。对于FFmpeg可能是一个.cmake脚本你需要手动下载它指向的实际压缩包。实操心得这个过程有点繁琐但一劳永逸。你可以把成功下载的这些依赖包备份起来以后在新机器上编译同版本OpenCV时直接拷贝到.cache目录能节省大量时间。另外如果某些非核心的依赖如某些测试数据实在下载失败可以在CMake列表中搜索对应的BUILD_或WITH_选项直接关闭它取消勾选。比如关闭BUILD_TESTS和BUILD_PERF_TESTS可以避免下载测试数据。反复点击“Configure”按钮直到所有红色条目消失并且底部日志窗口显示“Configuring done”且不再有新的下载错误。此时点击“Generate”按钮。如果成功日志会显示“Generating done”。现在打开D:\opencv_build\build文件夹你会发现里面生成了一个OpenCV.sln解决方案文件。至此CMake的任务圆满完成。4. Visual Studio 2017中的编译与安装现在我们进入了熟悉的Visual Studio环境进行编译。这一步机器性能越好耗时越短。4.1 编译配置与生成用Visual Studio 2017打开D:\opencv_build\build目录下的OpenCV.sln文件。打开后在解决方案资源管理器中你会看到一大堆项目。在顶部的工具栏找到“解决方案配置”下拉框。首先选择“Release”平台选择“x64”。我们通常先编译Release版本因为它优化程度高编译速度相对快生成的库文件也更小。在解决方案资源管理器里的任意位置右键选择“生成解决方案”。这是一个漫长的过程可能需要30分钟到2小时取决于你的CPU核心数和内存大小。编译过程中输出窗口会滚动显示进度。如果遇到错误通常会在这里显示。等待Release模式编译完全成功后再将解决方案配置切换到“Debug”再次右键“生成解决方案”编译Debug版本的库。Debug版本包含调试信息文件更大运行速度慢但用于开发时单步调试是必需的。注意事项务必确保在编译前VS的活动解决方案配置与平台匹配。一个常见错误是在x64平台下却用Win32配置编译这会导致链接器错误。另外如果编译过程中报错“找不到opencv2/xxx.hpp”之类的头文件错误很可能是CMake配置时OPENCV_EXTRA_MODULES_PATH没设对或者Contrib模块的版本不匹配需要回到CMake检查。4.2 安装部署编译成功并不意味着结束。我们需要执行“安装”操作将散落在build目录下各个子文件夹里的头文件.hpp、库文件.lib和动态链接库.dll整理并复制到我们之前用CMAKE_INSTALL_PREFIX指定的目录例如D:\opencv_build\install。在解决方案资源管理器中找到名为INSTALL的项目通常在CMakeTargets文件夹下。确保当前解决方案配置是“Release”和“x64”。在INSTALL项目上右键选择“仅用于项目” - “仅生成INSTALL”。VS会执行一个安装脚本将Release版本的所有必要文件复制到D:\opencv_build\install目录。将解决方案配置切换为“Debug”和“x64”。再次在INSTALL项目上右键选择“仅用于项目” - “仅生成INSTALL”。这将安装Debug版本的文件。安装完成后打开D:\opencv_build\install目录你会看到一个标准的软件目录结构include\opencv2\包含所有OpenCV头文件。x64\vc15\bin\包含Debug和Release子文件夹里面是运行时所需的.dll文件。x64\vc15\lib\包含Debug和Release子文件夹里面是链接时所需的.lib文件。这里的“vc15”对应Visual Studio 2017的编译器工具集版本。5. 环境配置与项目测试库编译安装好了接下来要教你的开发环境如何找到并使用它。这里以在Visual Studio 2017中创建一个新的控制台项目为例。5.1 配置Visual Studio项目属性创建一个新的“Windows控制台应用程序”项目命名为TestOpenCV。在解决方案资源管理器中右键项目名选择“属性”。确保右上角的“配置”是“所有配置”“平台”是“x64”。这样我们一次设置对Debug和Release都生效。进入“VC目录”包含目录添加D:\opencv_build\install\include。库目录添加D:\opencv_build\install\x64\vc15\lib。进入“链接器” - “输入” - “附加依赖项”对于Debug配置需要先在左上角配置下拉框切到Debug添加opencv_world452d.lib。末尾的d表示Debug库。对于Release配置切换配置到Release添加opencv_world452.lib。如果你没有勾选BUILD_opencv_world那么这里就需要添加一大堆lib如opencv_core452d.lib,opencv_imgproc452d.lib,opencv_highgui452d.lib等等非常麻烦。这就是推荐使用world模块的原因。5.2 编写并运行测试代码在项目的源文件中如main.cpp写入一段简单的测试代码#include opencv2/opencv.hpp #include iostream int main() { // 读取一张图片请替换为你的图片路径 cv::Mat image cv::imread(D:/test.jpg); // 使用正斜杠或双反斜杠 if (image.empty()) { std::cout Could not open or find the image! std::endl; return -1; } // 显示图片 cv::namedWindow(Test OpenCV, cv::WINDOW_AUTOSIZE); cv::imshow(Test OpenCV, image); // 等待按键 cv::waitKey(0); return 0; }将代码中的图片路径替换成你电脑上真实存在的一张图片路径如.jpg或.png。5.3 解决运行时错误DLL文件缺失直接按F5运行Debug模式你很可能会遇到一个经典错误“无法启动此程序因为计算机中丢失opencv_world452d.dll”。这是因为可执行文件运行时需要找到对应的动态链接库DLL。解决方法有三种推荐第一种将DLL目录加入系统PATH临时将D:\opencv_build\install\x64\vc15\bin添加到系统的PATH环境变量中然后重启VS或电脑。这是最一劳永逸的方法。将DLL复制到可执行文件目录在VS中编译生成后你的可执行文件.exe默认在项目下的x64\Debug或x64\Release文件夹里。将D:\opencv_build\install\x64\vc15\bin目录下对应的opencv_world452d.dllDebug用或opencv_world452.dllRelease用复制到你的.exe所在的同一个文件夹下。在VS项目属性中设置在项目属性 - “调试” - “环境”中添加一行PATHD:\opencv_build\install\x64\vc15\bin;%PATH%。这只在从VS启动调试时生效。处理好DLL后再次运行程序。如果一切顺利一个窗口将弹出并显示你指定的图片。恭喜你OpenCV编译、安装、配置、测试全部成功6. 常见问题与深度排查指南即使按照步骤操作也可能会遇到各种问题。这里汇总了一些典型问题及其解决方案。6.1 CMake配置阶段失败问题点击“Configure”后红色错误满屏提示找不到编译器。排查检查Visual Studio 2017是否安装了“使用C的桌面开发”工作负载。确认在CMake选择生成器时正确选择了“Visual Studio 15 2017”和“x64”。问题第三方库ippicv, ffmpeg下载失败。排查严格按照第3.3节的方法手动下载并放置到.cache目录。仔细核对文件名必须与CMakeDownloadLog.txt里记录的目标文件名完全一致包括后缀。有时URL可能失效可以尝试在开源镜像站或搜索引擎中搜索那个具体的文件名。问题配置时提示“Could NOT find PythonLibs”等Python相关警告。排查如果你不需要Python绑定可以忽略这些警告。如果想启用Python接口则需要确保系统已安装对应版本的Python如Python 3.8并且CMake能找到它。有时需要手动指定Python3_EXECUTABLE、Python3_INCLUDE_DIR和Python3_LIBRARY的路径。6.2 Visual Studio编译阶段失败问题编译时大量“无法打开opencv2/xxxx.hpp”或“找不到cv::xxx符号”的错误。排查这几乎肯定是头文件或模块路径问题。首先检查CMake中OPENCV_EXTRA_MODULES_PATH是否指向了正确的modules文件夹。其次在VS项目属性中确认“包含目录”添加的是install\include而不是build或sources下的include。最后确认代码中#include的路径正确。问题链接阶段失败提示“LNK1104: 无法打开文件‘opencv_world452d.lib’”。排查首先确认库文件是否已生成。去install\x64\vc15\lib目录下查看是否存在该lib文件。如果不存在说明编译或安装步骤未成功。如果存在则检查VS项目属性中的“库目录”是否指向了install\x64\vc15\lib以及“附加依赖项”里的库文件名是否拼写正确注意Debug带d。问题编译过程中卡死或内存不足。排查OpenCV编译非常消耗内存建议至少保证16GB物理内存。可以尝试关闭一些不必要的应用程序。在CMake中可以关闭BUILD_EXAMPLES、BUILD_TESTS、BUILD_PERF_TESTS来减少编译目标节省时间和内存。6.3 运行时错误问题程序编译链接成功但运行时崩溃错误代码涉及MSVCP140.dll或VCRUNTIME140.dll。排查这是Visual C运行时库版本不匹配。OpenCV 4.5.2用VS2017编译依赖的是VC 2017的运行时库v141工具集。你需要确保目标机器上安装了对应的“Visual C Redistributable for Visual Studio 2017”。可以从微软官网下载安装。问题imread读图成功但imshow窗口一片灰色或黑色。排查首先检查图片路径是否正确绝对路径比相对路径更可靠。其次HighGUI模块在Windows上依赖一些系统组件。如果使用预编译的FFmpeg有时会有兼容性问题。可以尝试在CMake中关闭WITH_FFMPEG然后重新编译测试。或者换一张不同格式如BMP的图片试试。6.4 性能与优化建议启用硬件加速如果你的CPU支持AVX2在CMake中设置CPU_BASELINEAVX2能带来可观的性能提升。对于Intel显卡可以尝试开启WITH_OPENCL和WITH_VA_INTEL选项并安装Intel的Media SDK可能获得视频编解码的硬件加速。减少编译时间如果只是做验证或学习可以在CMake中关闭BUILD_opencv_world然后只勾选你确定需要的模块如BUILD_opencv_core,BUILD_opencv_imgproc,BUILD_opencv_highgui。这样能显著减少需要编译的代码量。使用固态硬盘SSD作为源码和构建目录也能大幅提升编译速度。管理多个版本按照本教程的方法你可以通过改变CMAKE_INSTALL_PREFIX的路径如D:\opencv_build\install_vs2017_release在同一台机器上编译安装多个不同配置的OpenCV。在VS项目属性中切换包含目录、库目录和依赖项即可使用不同版本非常灵活。整个流程走下来从工具准备到成功运行测试程序虽然步骤不少但每一步都有其明确的目的。自己编译OpenCV最大的收获不仅仅是得到了一个可用的库更在于你完全掌控了构建过程理解了各个组件之间的关系未来遇到任何环境问题或定制需求你都知道从哪里入手解决。这套方法论不仅适用于OpenCV对于其他需要从源码编译的C大型开源项目如Point Cloud Library, TensorFlow C API等也同样具有参考价值。
返回列表