1.源码下载
OpenCV:https://github.com/opencv/opencv
contrib:https://github.com/opencv/opencv_contrib
注意本体和contrib的版本匹配,详见以下:
默认的是“master”分支,我们需要点击“Branch:master”按钮,点击“Tags”标签,在下拉列表中选择想要的版本。本文以4.1.0为例。
本体和扩展模块选择同样的分支:
选择“Download ZIP”下载到本地
2.CMake首次设置
CMake下载地址:https://cmake.org/download/
1)打开CMake,设置好OpenCV本体源码所在路径,以及存放生成的工程的目标路径
正确的源码路径如下图,包含一个CMakeList.txt文件,根据自己存放的位置进行设置。
注意:
路径中不能有中文
确保目标路径的硬盘剩余空间在18G以上
2)点击“Configure”
3)选择编译器:
当前版本不支持用vs 2019编译,选择2017。
4)在第二栏选择编译器架构,这里选择64位(x64)。要根据自己硬件架构进行选择:32位兼容性好(win32),64位速度快,arm架构的硬件要选择arm。
(注:老版本的CMake在上一步就会选择编译器架构)
5)点击“完成”进行第一次编译。这次编译可能会报错,但不用去管。我们会发现出现了很多红色背景的选项。
3.在CMake中进行contrib扩展模块等的详细设置
1)找到“OPENCV_EXTRA_MODULES_PATH”。(可在“Search”栏中直接搜索)
点击右侧的省略号选择下载的contrib源码中,“modules”文件夹的路径(注意不是contrib的主目录)。
该路径是下面这样的:
2)可选项:
a.如果需要使用surf特征检测之类的有专利的算法,需要勾选"OPENCV_ENABLE_NONFREE”:
b.可勾选“BUILD_opencvv_world”,这样最后的库是一个文件,引用更简便。
c.根据自身python版本和需要选择性勾选“BUILD_opencv_python2”,“BUILD_opencv_python3”
3)再次点击“Configure”。这次确保不会有红色的报错。
4.Download failed错误处理
最常见的错误应当是“Download failed”。这要归功于the wall。于是需要用一定手段手动下载。我们可以用以下方法获取到下载地址。
以ffmpeg下载失败为例:
报错信息形如下图,我们看到“Download failed”字样,确认是下载失败。
在报错信息上方我们可以找到下载失败的文件名opencv_ffmpeg.dll。
在下方Call Stack中可以找到ffmpeg库的.cmake文件路径:
用notepad或记事本打开ffmpeg.cmake,找到如下字段:
我们可以看到下载的URL: https://raw.githubusercontent.com/opencv/opencv_3rdparty/${FFMPEG_BINARIES_COMMIT}/ffmpeg/
其中 ${FFMPEG_BINARIES_COMMIT} 字段的内容可以在前面的代码中找到:
于是我们得到了下载的base url: https://raw.githubusercontent.com/opencv/opencv_3rdparty/759a23e24ab787a0979f8a93103dcc3105ec10c1/ffmpeg/
我们再看这段代码,它在一个foreach循环中:
通过之前的代码我们可以看到ids的元素,是BIN32,BIN64,CMAKE,并且紧接着定义了name_BIN32, name_BIN64, name_CMAKE
再看循环体中的代码
我们可以明白它是分别下载了这三个文件:
于是我们将他们分别和之前得到的base url拼接成了三个下载地址:
分别粘贴到浏览器中下载到自定文件夹。(其中的cmake文件可能不会自动下载,需要在页面中右键点“另存为”)
回到刚才那个cmake文件,我们将网址那行代码注释掉,替换成刚刚存放下载文件的目录:
保存后,再次点击“Configure”。可以看到ffmpeg不再报错:
其他库下载失败的问题可以用同样的方法解决。
5. 编译生成
第二次“Configure”成功后,点击“Generate”,然后用对应版本的vs打开生成的工程。
然后在vs中选择Build(生成)->Batch Build(批生成)。
在弹出的窗口中勾选ALL_BUILD和INSTALL两个项目的Debug和Release版,点击Build(生成)。
大约半小时后,编译完成:
编译结果在install文件夹中:
include装着头文件,x64包含64位库。OpenCV源码编译完成。