下载WinGW
MinGW,是Minimalist GNU for Windows的缩写。它是一个可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合,允许你在GNU/Linux和Windows平台生成本地的Windows程序而不需要第三方C运行时(C Runtime)库。MinGW 是一组包含文件和端口库,其功能是允许控制台模式的程序使用微软的标准C运行时(C Runtime)库(MSVCRT.DLL),该库在所有的 NT OS 上有效,在所有的 Windows 95发行版以上的 Windows OS 有效,使用基本运行时,你可以使用 GCC 写控制台模式的符合美国标准化组织(ANSI)程序,可以使用微软提供的 C 运行时(C Runtime)扩展,与基本运行时相结合,就可以有充分的权利既使用 CRT(C Runtime)又使用 WindowsAPI功能(该段内容来自百度百科)
前往下载:https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/
或者:
一直往下面滑动找到这里:
解压到本地
配置环境变量
下载CMake
前往官网:https://cmake.org/download/
往下面滑动找到:
下载好之后安装就行了,我安装的时候勾选了自动配置环境变量,当然也可以不用勾选,如果没有勾选需要手动的把bin目录配置到环境变量
我的安装位置:D:\DevelopeSofts\CMake
去查看环境变量,确保万无一失
CMake编译OpenCV源码
(1).前往opencv的安装目录:D:\DevelopeSofts\OpenCV\opencv
创建一个文件夹:build_mingw64
用于存放编译之后的opencv
(2).前往cmake安装目录,双击cmake-gui
程序开始运行cmake
(3).在cmake-gui
程序中配置两个参数:
源码路径:D:\DevelopeSofts\OpenCV\opencv\sources
输出路径:D:\DevelopeSofts\OpenCV\opencv\build_mingw64
(4).点击配置
等待Configure完成
Configure一般不会一次成功,因为FFMPEG总是在cmake的过程中下载失败,FFMPEG是视频编解码需要的库,所以非常必要。
尽管Configure第一次无法成功,但还是得点一下才能产生日志,然后才能根据日志去解决问题。第一次Configure后结果见下图,注意到上面一栏中一坨红色,表明配置存在问题,下面可以看到FFMPEG那里都是NO,往上翻一翻日志就会知道是相关的dll下载不成功。
解决Configure失败
可以打开下载日志文件D:\DevelopeSofts\OpenCV\opencv\build_mingw64
查看哪些组件下载失败
此文件中也会告诉我们到哪里下载缺失的组件。打开该日志文件后可以找到如下信息:
#do_copy "opencv_videoio_ffmpeg_64.dll" "38a638851e064c591ce812e27ed43f1f" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/7da61f0695eabf8972a2c302bf1632a3d99fb0d5/ffmpeg/opencv_videoio_ffmpeg_64.dll" "D:/DevelopeSofts/OpenCV/opencv/build_mingw64/3rdparty/ffmpeg"
#missing "D:/DevelopeSofts/OpenCV/opencv/build_mingw64/3rdparty/ffmpeg/opencv_videoio_ffmpeg_64.dll"
#check_md5 "D:/DevelopeSofts/OpenCV/opencv/sources/.cache/ffmpeg/38a638851e064c591ce812e27ed43f1f-opencv_videoio_ffmpeg_64.dll"
#mismatch_md5 "D:/DevelopeSofts/OpenCV/opencv/sources/.cache/ffmpeg/38a638851e064c591ce812e27ed43f1f-opencv_videoio_ffmpeg_64.dll" "d41d8cd98f00b204e9800998ecf8427e"
#delete "D:/DevelopeSofts/OpenCV/opencv/sources/.cache/ffmpeg/38a638851e064c591ce812e27ed43f1f-opencv_videoio_ffmpeg_64.dll"
#cmake_download "D:/DevelopeSofts/OpenCV/opencv/sources/.cache/ffmpeg/38a638851e064c591ce812e27ed43f1f-opencv_videoio_ffmpeg_64.dll" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/7da61f0695eabf8972a2c302bf1632a3d99fb0d5/ffmpeg/opencv_videoio_ffmpeg_64.dll"
#try 1
# timeout on name lookup is not supported
# getaddrinfo(3) failed for raw.githubusercontent.com:443
# Could not resolve host: raw.githubusercontent.com
# Closing connection
上面的日志至少告诉我们如下信息:1. opencv_videoio_ffmpeg.dll的下载网址;2. 本地存放的路径;3. 需要校验md5。
如果下载网址找不到,就配置一下DNS:打开hosts文件:
185.199.108.133 raw.githubusercontent.com
20.205.243.166 github.com
因为要校验md5,所以我们不能随便下载一个同名dll放到本地存放路径下,必需下载上述网址的dll。接下来手动下载上述文件并放入指定目录中即可。同理下载opencv_videoio_ffmpeg_64.dll和ffmpeg_version.cmake。
需要注意 ffmpeg_version.cmake 点击链接后可能直接打开了链接而不是下载,此时不能使用复制粘贴的方式把信息搞下来,而应该在网页上点右键 -> 另存为的方式保存文件,然后把后缀.txt干掉,不然MD5校验不通过。
1.下载 ffmpeg_version.cmake
看日志信息我的存放位置:D:/DevelopeSofts/OpenCV/opencv/build_mingw64/3rdparty/ffmpeg
2.下载 opencv_videoio_ffmpeg.dll
3.下载 opencv_videoio_ffmpeg_64.dll
4.下载ade-0.1.2a.zip
5.再次Configure之后就没有报错了
继续编译
在上栏中,确保以下几个选项没有被打勾,如果打勾的话可能导致编译失败:
(1)ENABLE_PRECOMPILED_HEADERS
(2)WITH_MSMF
(3)WITH_IPP
(4)WITH_TBB
(5)OPENCV_ENABLE_ALLOCATOR_STATS
(1)-(4)据说是专门为了支持VS而设置的;
(5)如果勾上的话可能出现以下错误:
gcc: error: long: No such file or directory
D:\Program\mingw64\bin\windres.exe: preprocessing failed.
mingw32-make[2]: *** [modules\core\CMakeFiles\opencv_core.dir\build.make:1494: modules/core/CMakeFiles/opencv_core.dir/vs_version.rc.obj] Error 1
mingw32-make[2]: *** Waiting for unfinished jobs…
mingw32-make[1]: *** [CMakeFiles\Makefile2:1882: modules/core/CMakeFiles/opencv_core.dir/all] Error 2
mingw32-make: *** [Makefile:181: all] Error 2
在上栏中,有一个很特别的选项,叫BUILD_opencv_world,如果勾上的话,编译后会生成一个比较大的dll,如果不打勾的话,则生成一堆零散的dll。我的反正没有打勾!
点击Generate生成工程,这一步通常没有什么坑,并且速度比较快。
进入以及构建好的目录cmd回车
输入以下命令开始编译:
mingw32-make 或 mingw32-make -j8
-j8的意思是使用多线程编译,不然速度有点慢。后面那个8表示线程数,CPU好的话可以改大点,不太好就改小点。
中间如果有warning不用管,只要不是error就行,error会导致编译失败退出。如果error了,下次再编译前最好使用下面命令clean一下之前的错误编译。
mingw32-make clean
编译完成之后,就可以在bin目录下面看到如下文件: