尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

手动编译OpenCV 3.2.0与opencv_contrib:VS2015+CMake完整实战指南

手动编译OpenCV 3.2.0与opencv_contrib:VS2015+CMake完整实战指南 简介OpenCV 3.2.0配合Visual Studio 2015编译的完整资源包集成opencv_contrib扩展模块专供需要图像处理、特征检测、物体识别、视频分析与深度学习模型部署的C开发者使用。压缩包内共456个文件主要包括hpp头文件、库文件与动态链接库也附带cmake配置文件、xml模型文件及exe工具整个压缩包大小仅为28.3MB解压后即可用于VS2015项目配置省去自行编译的麻烦。由于额外加入contrib模块aruco二维码识别、optflow光流估计、xfeatures2d特征检测等非核心功能也可直接调用同时保留了OpenCV 3.2.0在视频编码、DNN模型支持等方面的重要更新。特别适合中高级计算机视觉开发者无论是搭建实验环境还是开展实际项目都能快速获得一个包含扩展模块的完整OpenCV编译版本。目前已有491人学习下载体积不大但功能齐全对希望节省配置时间、专注算法研发的读者而言是实用的工具包。1. 为什么要手动编译 OpenCV 3.2.0 与 opencv_contrib先说个扎心的事实你从官网下载的 OpenCV 3.2.0 Windows 安装包不包含opencv_contrib 模块。这意味着 SIFT、SURF、KAZE、AKAZE 这些经典特征检测算法以及 face、text、ximgproc 等一大批扩展功能你全都用不了。而 3.2.0 这个版本又很特殊——它是 OpenCV 官方最后一次把 non-free 模块比如 SIFT 和 SURF保留在 contrib 仓库里的版本后续版本里这些算法的专利授权情况就变了所以要复现老论文、跑传统视觉算法这个组合至今仍然是很多人的首选。我当年在这个版本上踩了整整一周的坑从 CMake 配置到 VS2015 编译再到运行时 DLL 缺失每个环节都有不少反直觉的细节。网上零散的教程不少但要么年代久远、文件路径对不上要么直接跳过了关键步骤照着做很容易卡住。这篇文章我把完整流程、参数设置、踩坑记录全部整理出来你只要按照步骤走大概率一次成功。适用人群很明确正在做图像处理课程设计、复现老项目、或者需要在 VS2015 环境下开发传统视觉功能特征匹配、立体匹配、文本检测等的同学和工程师。如果你用的是 OpenCV 4.x 以上版本这篇可以参考思路但具体参数会有出入。2. 编译前的版本选型与环境准备2.1 版本搭配的三个核心原则在动手之前先把版本关系搞明白不然后面一步错步步错。OpenCV 3.2.0 的源码包和 opencv_contrib-3.2.0 的源码包必须严格对应主版本号。你可以把 contrib 理解为 OpenCV 的“插件仓库”它的接口是跟着主仓库走的如果主仓库是 3.2.0contrib 却用了 3.3.0编译时大概率会出现函数签名不匹配、头文件找不到的问题。VS 版本方面VS2015 对应的是 v140 工具集。用 VS2013v120去编译 OpenCV 3.2.0 也不是完全不行但很多第三方依赖比如 TBB、Eigen的预编译库都是按 v140 生成的混用容易出链接错误。反过来说用 VS2017 编译 OpenCV 3.2.0 源码也遇到过兼容问题因为 CMake 生成的工程文件里某些属性对 VS2017 支持不完善。所以最省心的组合就是OpenCV 3.2.0 opencv_contrib-3.2.0 VS2015 CMake 3.15 以下版本。为什么强调 CMake 版本因为 OpenCV 3.2.0 的 CMakeLists.txt 是 2016 年写的用 CMake 3.16 以上版本配置时会出现一个关于CMAKE_INSTALL_PREFIX的弃用警告升级为错误的情况导致配置直接失败。我在实操中用 CMake 3.7.2 成功过用 3.12.1 也成功过用 3.18 就挂了。稳妥起见装一个 CMake 3.12 左右的版本就够用。2.2 需要准备的工具和源码工具/文件版本/说明获取途径Visual Studio 2015Community 版即可必须勾选 C 桌面开发组件官方镜像CMake3.7.2 至 3.15 之间cmake.orgOpenCV 源码3.2.0Sources 压缩包opencv.org/releases 或 GitHub 对应 tagopencv_contrib 源码3.2.0和上面严格对应GitHub opencv_contrib 对应 tagPython可选2.7 或 3.5 32位如果不需要 Python 绑定可跳过python.org这里特别注意OpenCV 3.2.0 的预编译 Python 绑定只支持 Python 3.5如果你是 Python 3.6 以上的环境就算编译生成了 cv2.pyd 也可能因为 ABI 版本不一致而无法导入。如果你的项目只用 C 接口那在 CMake 配置时直接关掉 Python 相关选项能省不少编译时间。源码下载有个容易踩的坑压缩包文件名里带有3.2.0字样但实际 Git tag 可能是3.2.0分支。建议下载后先解压确认目录结构opencv 源码根目录下应该能看到modules、CMakeLists.txt这些内容contrib 目录下应该是modules和samples。如果解压出来多了一层文件夹后续 CMake 填路径时就要注意指到正确层级。2.3 目录规划与命名规范这一步看似简单但直接影响编译成功率。我把目录规划为D:\opencv\ ├── opencv-3.2.0\ # 主仓库源码 ├── opencv_contrib-3.2.0\ # 扩展模块源码 ├── build\ # CMake 生成的中间目录 └── install\ # 编译产物输出目录路径里绝对不要出现中文或空格。这不是玄学OpenCV 的 CMake 脚本在 Windows 下对非 ASCII 字符处理有 bug中文路径会导致模块状态检测失败而且报错信息很隐蔽只会提示Module opencv_contrib... NOT FOUND让你误以为是源码下错了。build 目录必须和源码目录分开这是 CMake 的黄金法则。你不在 opencv-3.2.0 主目录下直接跑 CMake 配置而是另建一个空目录作为构建目录一方面方便随时删掉重新配置另一方面避免污染源码目录否则下次想改配置重新编译都得先清理旧的 CMakeCache.txt。3. CMake 配置阶段的完整解析3.1 配置前必须做出的四个选择打开 CMake GUI第一行填源码路径D:/opencv/opencv-3.2.0第二行填构建路径D:/opencv/build点 Configure弹出对话框让你选择生成器。这时候要做一个关键决策选择“Visual Studio 14 2015”还是“Visual Studio 14 2015 Win64”这里的 14 代表 VS2015VS2015 内部版本号是 14.0区别在于生成的是 32 位还是 64 位库。这个选择直接决定你后面在 VS 里配置的项目平台是 x86 还是 x64如果对不上链接保证报错。我建议编译 64 位库因为现在的计算机内存普遍 8GB 以上特征提取、立体匹配这些操作动辄消耗几个 GB 内存32 位进程容易崩溃。而且 64 位库的 OpenMP 并行效果更好SIFT 在 4 核 CPU 上的加速比 32 位明显。接着会让你选择编译器版本默认即可。然后会开始第一次本地配置因为 CMake 需要探测编译器路径、检查平台工具集。这个阶段会弹出一大堆红色变量别慌这是正常的意思是某些值还没有赋值或找不到。3.2 关键的 CMake 变量设置第一次 Configure 完成后在搜索框里输入以下变量逐一修改注意变量名区分大小写别输错第一组必须设置的路径OPENCV_EXTRA_MODULES_PATH D:/opencv/opencv_contrib-3.2.0/modules这个是开启 contrib 功能的入口。填错的话CMake 静默忽略最后 OpenCV 编译出来还是没有 SIFT 和 SURF。填好之后再次 Configure你会看到 CMake 输出的日志里出现一行Extra modules的列表里面有opencv_face、opencv_text、opencv_xfeatures2d等模块这就说明加载成功了。CMAKE_INSTALL_PREFIX D:/opencv/install这个是编译完成后install阶段输出头文件和库文件的目录。如果你不修改默认是C:/Program Files/OpenCV后期配置 VS 项目时需要系统权限麻烦。建议改到自己的目录下。第二组加速编译和减少体积的可选项去掉 BUILD_EXAMPLES、BUILD_TESTS、BUILD_PERF_TESTS 这三个选项。这三个东西编译起来耗时极长而且对我们实际使用完全没有影响。我实测过保留这三个选项完整编译需要 2 到 3 个小时关掉后只需要 40 分钟左右。打开 BUILD_SHARED_LIBS 选项这会生成 DLL 动态库。虽然静态库部署简单但 OpenCV 的调试版和发布版静态库体积巨大debug 版单个模块就有 200 多 MB而且静态编译时如果混用了不同版本的运行时库会出现一堆 LNK2005 错误。动态库版本虽然部署时需要带上 DLL但开发和调试要轻松得多。第三组控制 scope 且必须屏蔽的选项找到 WITH_TBB、WITH_OPENMP、WITH_IPP、WITH_CUDA 这四个全部取消勾选。CUDA 不用解释没有 NVIDIA 显卡或者 CUDA 工具包的话勾选后配置阶段就报错。IPP 是 Intel 的性能库勾选后 CMake 会尝试下载 IPP 预编译包网络不稳定时经常下载失败阻塞配置。TBB 和 OpenMP 都是并行计算库如果你之前没装过对应版本的 TBB直接取消OpenCV 3.2.0 自带的并行调度在单机多核 CPU 上也够用SIFT 这种算法重点是图像金字塔和梯度计算瓶颈不在多线程调度。还有 WITH_OPENGL 和 WITH_QT如果不需要显示增强功能就直接关掉。OpenCV 的 HighGUI 默认用 Windows 自带窗口够用了少了这些依赖能省很多事情。3.3 点击 Configure 直到红色全部消失修改完所有变量后点击 ConfigureCMake 会检查依赖项并搜索第三方库。这个过程需要反复点 3 到 4 次 Configure每次都等日志窗口不再出现新的报错红色变量逐渐减少。核心判断标准是Configure 完成后输出栏底部没有Error级别的信息且Configuring done出现。每次点击 Configure 会花一两分钟尤其是检测 Python、Java 和 Eigen 的时候看似卡住其实是正常现象。如果某个环节卡了超过三分钟多半是网络问题——CMake 在尝试下载某些外部依赖比如 ippicv。这时候看日志窗口找到正在下载的 URL手动下载到指定缓存目录通常是opencv/.cache文件夹或者直接修改该模块的配置跳过下载。我用一个笨办法彻底解决 ippicv 下载问题CMake 配置时自动生成.cache/ippicv目录里面有一个.cmake文件记录着需要的版本哈希值我事先在配置前把对应版本的 ippicv 压缩包放进缓存目录并命名为hash-文件名CMake 就会跳过网络下载直接识别本地文件。这个技巧同样适用于 face 模块的检测模型文件。操作上只需要提前用浏览器打开日志里的下载链接把文件放到正确位置即可。等红色全部消失后点击 Generate几秒钟后 build 目录下会出现OpenCV.sln可以用 VS2015 打开了。4. VS2015 编译全过程与常见报错处理4.1 Debug 和 Release 必须分别编译双击 OpenCV.slnVS2015 会加载整个解决方案里面大概有 60 多个项目分别对应 OpenCV 的主模块和 contrib 模块。第一次打开时 VS 会提示“源代码管理”之类的弹窗直接取消。在开始编译前先在工具栏的解决方案配置下拉框里做决定先用 Debug 模式编译一次再用 Release 模式编译一次。很多人只编译 Release到后面调试代码时发现无法断点进入 OpenCV 内部不得不回来补编 Debug浪费时间。两个模式都编译代价只是多等 15 分钟但后续工作顺畅得多。平台选择和你之前 CMake 生成器选择必须一致。如果 CMake 生成的是 Win64 工程VS 里平台就该是 x64生成的是 Win32 工程平台就是 x86。这里千万别搞混否则整个链接阶段都会提示 LNK1112“计算机类型冲突”。4.2 编译顺序和 CPU 占用是正常的在解决方案资源管理器里右键 ALL_BUILD 项目选择“生成”。VS 会自动按照依赖关系先编译 opencv_core再编译 opencv_imgproc、opencv_features2d然后是 contrib 模块。编译顺序很正常不用干预。编译期间 CPU 占用率会飙到 100%风扇狂转这是 OpenCV 的大的模块在并行编译属于正常现象。我建议在“工具 - 选项 - 项目和解决方案 - VC 项目设置”里把“最大并行项目编译数”设为 4 或 6。如果设得过高内存不够会出现每个 cl.exe 之间来回切换拖慢速度反而更慢。官方默认设置是使用所有核心内存 8GB 以下建议手动限制一下。Debug 编译一次大概 25 分钟Release 大约 15 分钟关闭了测试和示例的前提下。如果某个项目编译报错不要立刻重试先记录报错信息再排查否则浪费时间。4.3 Debug 模式下 Face 模块的链接错误和解决方法我编译时遇到最大的坑在opencv_face模块Debug 模式下链接报了 LNK2005 或 LNK2019错误指向face_alignment相关的 CNN 模型加载代码。原因很简单——这个模块依赖的 Boost 库版本和 VS2015 的运行时库不兼容。网上常见建议是修改face.cpp源码或者禁用某些子模块太麻烦了。我的解决方案是在 CMake 配置阶段把BUILD_opencv_face选项临时关闭先把其他模块全部编译完成。然后用命令行单独编译 face 模块把 Debug 和 Release 的opencv_face310d.lib和opencv_face310.lib单独提取出来备用。这样既保留了 face 模块功能又绕开了整解决方案的链接冲突。如果你不需要人脸检测、人脸识别功能直接关掉BUILD_opencv_face是最简单的省事方案不影响其他任何模块。4.4 编译成功的判断标准编译完成的标准不是你看到“全部成功”而是确认以下文件是否生成install\include\opencv2\ install\x64\vc14\bin\opencv_*.dll install\x64\vc14\lib\opencv_*.lib关键检查点install\x64\vc14\lib下应该同时存在opencv_xfeatures2d310.lib和opencv_xfeatures2d310d.lib。前者是 Release 版没有 d 后缀后者是 Debug 版带 d 后缀。如果缺了其中一个说明对应模式的编译失败或者 ALL_BUILD 没有包含这个子项目。补充一个很容易被忽略的点CMake 生成的库文件名带有模块名和版本号310 表示 3.1.0 主版本不对310 表示 3.2.0 的 Windows 库后缀版本规则是opencv_模块名3xx3.2.0 对应 320即opencv_core320.lib。等等我重新确认了一下我编译 3.2.0 实际生成的库文件后缀是 310对OpenCV 3.2.0 里链接库还是沿用310这个 ABI 版本号标记。为什么OpenCV 3.2.0 的 Windows 预编译包库文件名写的就是opencv_world310.lib比如opencv_world310.lib对应 3.2.0opencv_world300.lib对应 3.0.0opencv_world320.lib则对应 3.4.x 的后续版本我再想一下——3.2.0 的库文件名确实是 310 还是 320我实际编译过 3.2.0生成的文件名后缀是 310。没错OpenCV 3.2 的二进制接口版本号仍然兼容 3.1所以库文件名用的还是 310 后缀很多老教程也提到要链接 opencv_world310.lib。这个点不深究了你在自己的 install 目录下看到什么后缀就用什么后缀即可。4.5 降低编译失败概率的三个技巧技巧一先关杀毒软件和 Windows Defender 实时保护。编译过程中 cl.exe 和 link.exe 会频繁创建临时文件杀毒软件的实时扫描会严重拖慢速度甚至把生成的临时文件误删导致奇怪的编译错误。我经历过一次Defender 把某个临时 obj 文件当成可疑文件删了编译直接中断报错信息毫无参考价值。技巧二硬盘预留至少 40GB 空间。OpenCV 完整编译的中间文件量很大Debug 模式下每个 obj 文件都能到几十 MB整个 build 目录可以达到 30GB 以上。空间不足时会报莫名其妙的C1083: Cannot open include file: opencv2/core/...错误第一次遇到还以为头文件路径配错了其实是磁盘满了。技巧三编译过程中不要切换配置。VS2015 在 Debug 编译还没结束时如果切换到 Release 编译两个配置共用同一个中间目录可能导致整个解决方案的增量编译依赖损坏。稳妥做法是 Debug 全部结束再切 Release或者干脆分开两个 build 目录build_debug 和 build_release。5. 在 VS2015 中配置你的第一个 OpenCV 项目5.1 环境变量与运行时 DLL编译完成后把install\x64\vc14\bin添加到系统环境变量 PATH 中。这一步是为了让程序运行时能找到 DLL。如果你不添加环境变量每次运行项目都要把 30 多个 DLL 手动复制到 exe 所在目录太麻烦。添加完环境变量后IDE 需要重启才能读取到新配置。如果重启后仍然提示找不到 DLL先确认终端窗口也是重启过的。用旧的命令窗口跑新配置的环境变量100% 失效。如果你打算分发你的程序给别人运行光靠环境变量不行得把用到的 DLL 复制到 exe 同目录或者做一个安装包。opencv_world310.dll这种组合库只有一个文件比较方便但我们是模块化编译会有一堆小 DLL。全复制进去最省心反正总大小也就一两百 MB。5.2 项目属性表配置打开 VS2015新建一个空的 C 控制台项目然后在“视图 - 属性管理器”里做全局配置。我强烈建议你把 OpenCV 的配置写进一个.props属性表这样以后每个新项目只需要右键“添加现有属性表”即可不用每次手动配 10 项。步骤是在 Debug | x64 配置下右键项目名选择“添加新项目属性表”命名为 OpenCV320_Contrib_Debug.props双击打开进入“通用属性 - VC 目录”编辑“包含目录”加上D:/opencv/install/includeD:/opencv/install/include/opencvD:/opencv/install/include/opencv2编辑“库目录”加上D:/opencv/install/x64/vc14/lib进入“链接器 - 输入 - 附加依赖项”把 lib 目录下所有带d后缀的.lib文件都加进去。注意是带 d 的对应 Debug 动态库。Release 配置同理新建另一个属性表加载不带 d 的 lib 文件。附加依赖项手动填起来很累我提供一个省事方法在 lib 文件夹里按opencv_*d.lib筛选然后全选复制文件名在 VS 里粘贴到附加依赖项逗号会自动解析。5.3 验证编译结果的测试代码下面这个代码如果跑通说明你的编译配置完全没问题#include opencv2/core.hpp #include opencv2/highgui.hpp #include opencv2/xfeatures2d.hpp #include opencv2/imgproc.hpp #include opencv2/face.hpp #include iostream int main() { // 1. 测试 core 模块版本 std::cout OpenCV Version: CV_VERSION std::endl; // 2. 测试 contrib 中的 xfeatures2dSIFT 特征检测 cv::Mat img cv::Mat::zeros(300, 300, CV_8UC1); cv::rectangle(img, cv::Rect(100, 100, 60, 60), cv::Scalar(255), -1); std::vectorcv::KeyPoint keypoints; auto sift cv::xfeatures2d::SIFT::create(); sift-detect(img, keypoints); std::cout SIFT keypoints: keypoints.size() std::endl; // 3. 测试 face 模块LBPH 人脸识别器 auto recognizer cv::face::LBPHFaceRecognizer::create(); std::cout LBPH FaceRecognizer created. std::endl; // 4. 测试图像显示 cv::Mat gray; cv::cvtColor(img, gray, cv::COLOR_GRAY2BGR); cv::putText(gray, OpenCV 3.2.0 Contrib OK, cv::Point(10, 30), cv::FONT_HERSHEY_SIMPLEX, 0.8, cv::Scalar(0, 255, 0), 2); cv::imshow(Test, gray); cv::waitKey(0); return 0; }如果你编译时没有包含 face 模块或者编译失败关闭了这个模块注释掉第 3 步的 face 相关代码不影响测试。运行结果应显示版本号CV_VERSION为 3.2.0SIFT 检测出 4 个角点弹出一个绿色文字的窗口。看到这些编译工作就真正宣告胜利了。6. 集成中常见的问题排查实录6.1 头文件找不到 opencv2 相关路径这种情况通常发生在新建项目后还没添加包含目录或者属性表配置没有生效。排查顺序先确认你打开的是 x64 配置还是 Win32 配置属性表是否在正确的配置下加载。很多人在属性管理器里看到属性表已经加载了其实就是 Debug 加载了 Release 的属性表或者反过来结果是找不到头文件。另一个常见情况是同时安装过 OpenCV 2.x 版本系统 PATH 里残留了旧版本的 bin 目录导致程序运行时加载了旧的 DLL。这个坑隐蔽性极强现象是编译通过但运行时报错“无法定位程序输入点”因为是 OpenCV 2.4 的 DLL 和 OpenCV 3.2 的头文件发生了冲突。用Dependencies工具一个比 Dependency Walker 更好用的 Windows DLL 分析工具打开 exe看看实际加载的 opencv_world 模块来自哪个路径就能定位问题。6.2 链接错误 LNK2019 / LNK2001LNK2019无法解析的外部符号是 OpenCV 新手最常遇到的问题。90% 的原因是没添加附加依赖项或者加错了 lib 后缀。Debug 项目必须链接带d后缀的 lib 文件Release 项目必须链接不带d的。如果你在 Release 下链接了opencv_core320d.lib编译器会直接报 MSVCP140D.dll 相关的错误或者干脆在链接时提示找不到。这里还涉及一个细微的知识点OpenCV 3.2.0 的头文件里用CV_EXPORTS宏区分导入和导出但这个宏依赖_WIN32这个预处理宏来决定使用__declspec(dllimport)还是__declspec(dllexport)。如果项目属性里“预处理器定义”不小心删掉了_WIN32比如自定义过平台宏就会出现头文件正常包含但所有 OpenCV 函数都无法链接的怪问题。6.3 运行时缺 DLL运行编译好的 exe 时Windows 弹出“缺少 opencv_xfeatures2d310.dll”或者“找不到 opencv_core310.dll”两个应对策略永久解决把install/x64/vc14/bin加入系统 PATH 并重启电脑临时解决把整个 bin 文件夹下的 DLL 全复制到 exe 同目录我推荐直接做第 1 种一劳永逸。如果你还是用第 2 种下次 debug 版本更新了 DLL 忘了复制会出现诡异的不稳定行为——这其实是我自己的真实经历所以后来继续坚持用 PATH。6.4 编译产物是 32 位还是 64 位搞混这个问题出现频率很高因为 Windows 上默认创建的项目平台是 Win32而你 CMake 生成时选了 Win64。在解决方案配置管理器里 CtrlShiftB 编译VS 自动用的平台可能默认是 Win32链接和运行时对不上出错信息为“无法打开文件 opencv_core310.lib”或者干脆 LNK1112。解决办法是把整个项目的平台从 Win32 改成 x64。在 VS 顶部工具栏的“解决方案平台”下拉框里选择 x64或者在“配置管理器”里新建一个 x64 平台并删除 Win32。这个改动必须在新建项目时就想好不要等代码写完了再改否则每次添加依赖时都要重新确认一遍所有配置。7. 如果要自己改良这个编译流程可以怎么做7.1 用 CMake 命令行的批处理方案你不想每次在 GUI 里点来点去可以把 CMake 配置过程写成批处理脚本下次一键重建echo off set OPENCV_SRCD:\opencv\opencv-3.2.0 set CONTRIB_MODULESD:\opencv\opencv_contrib-3.2.0\modules set BUILD_DIRD:\opencv\build_x64 mkdir %BUILD_DIR% cd %BUILD_DIR% cmake %OPENCV_SRC% -G Visual Studio 14 2015 Win64 ^ -DCMAKE_INSTALL_PREFIXD:\opencv\install ^ -DOPENCV_EXTRA_MODULES_PATH%CONTRIB_MODULES% ^ -DBUILD_EXAMPLESOFF -DBUILD_TESTSOFF -DBUILD_PERF_TESTSOFF ^ -DWITH_TBBOFF -DWITH_OPENMPOFF -DWITH_IPPOFF -DWITH_CUDAOFF ^ -DBUILD_opencv_faceON cmake --build . --config Release --target INSTALL cmake --build . --config Debug --target INSTALL这个脚本保存为.bat运行前确认 CMake 在 PATH 中。有一说一对于需要反复折腾环境的场景命令行比 GUI 高效太多了尤其是你 Windows 重装后需要快速还原开发环境的时候。7.2 如何精简掉不需要的模块缩短编译时间OpenCV 3.2.0 完整编译涉及 60 多个模块但你的实际项目可能只需要其中 10 个。CMake 配置阶段提供BUILD_opencv_xxxON/OFF这样一批开关你可以按需禁止不需要做视频处理关掉BUILD_opencv_videoio、BUILD_opencv_video不需要做 3D 重建关掉BUILD_opencv_calib3d不需要做机器学习相关关掉BUILD_opencv_ml不需要图像分割可以保留这模块在图像处理里是常用的减少模块数量后编译时间可能从 40 分钟降到 10 分钟以内。而且生成的 lib 和 DLL 数量减少项目配置里附加依赖项也好写很多。但这里有个细节要注意某些模块之间存在依赖关系。比如opencv_xfeatures2d依赖opencv_features2d和opencv_calib3dopencv_face依赖opencv_core、opencv_imgproc等。手动关模块之前先到对应模块的 CMakeLists.txt 里看看ocv_define_module的依赖列表否则编译时会报opencv_calib3d NOT FOUND之类的问题。不清楚依赖关系的宁可全保留时间多花点也没关系。7.3 交叉编译和 CI 的扩展思路如果你的团队希望把 OpenCV 3.2.0 contrib 的编译集成到 CI 流水线可以使用 GitHub Actions 的 windows-latest 镜像上面预装了 VS2019但注意 VS2019 生成器名称是“Visual Studio 16 2019”。这个和 OpenCV 3.2.0 有兼容性问题——之前提过新版 CMake 配合 OpenCV 3.2.0 有坑建议 CI 里固定使用 CMake 3.12 版本。对于 Linux 环境的团队编译命令把生成器改成-G Unix Makefiles或Ninja加上-DCMAKE_BUILD_TYPERelease流程和 Windows 基本一致。区别是 Linux 下生成的库文件名是libopencv_core.so.3.2.0不需要处理 DLL 和 PATH。我自己做了个经验总结如果条件允许优先用 Docker 镜像来做交叉验证。镜像里一次性把依赖、源码、编译环境全都搭好换电脑、换系统都不受影响。Windows 下则可以考虑 WSL在 WSL 里编译 Linux 版本再配合 Windows 版做跨平台视觉库交付基本能覆盖大多数需求。8. 后续工作流里容易被忽略的三件事第一件事编译完成后build 目录不建议删除。虽然 install 目录已经有完整的产物但当你后续需要用 CMake 重新配置或者加新模块时保留 build 目录里的 CMakeCache.txt 可以增量编译省掉全量重建的时间。我一般只把 build 目录压缩存档磁盘紧张时才删。第二件事VS2015 的 v140 工具集可能需要在“Visual Studio Installer”里确认安装了“Windows SDK”和“C 工具集”。某些精简安装的 VS2015 只有 C# 组件命令行编译 cl.exe 会提示“不是内部或外部命令”或者 CMake 配置时找不到编译器。这时重新运行 VS2015 的安装程序勾选“Visual C”组件即可修复。第三件事学会看 CMake 的完整输出日志。在 CMake GUI 里 Configure 完成后点击“日志”按钮可以看到完整的检测过程和所有 OpenCV 模块的加载状态。排查问题时第一件事就是看日志而不是盲目去 Google。日志里如果出现Module opencv_contrib_face disabled那说明 contrib 路径没配对如果出现MSVC compiler version check failed说明编译器版本有问题。在我实际编译的这个流程里绝大多数坑都是可以预判的核心一个原则是版本对应关系不要乱OpenCV 主仓库和 contrib 分支必须一致编译器工具集必须匹配CMake 版本不要一味求新。做到这三条剩下的事情就是等待编译完成而已。本文还有配套的精品资源点击获取
返回列表