参考文章:
https://www.cnblogs.com/kensporger/archive/2020/02/19/12320622.html
1. 安装MinGW-64 和 CMake,这两个一定要把环境变量添加到电脑的环境变量中,并且打开cmake-gui,细节见上文链接
2.生成MakeFiles。
①先从opencv官网上下载opencv windows源码,建议先在
C:\Windows\System32\drivers\etc\hosts文件最后追加:
151.101.72.133 raw.githubusercontent.com
因为cmake-gui会下载一些文件,这些文件都在raw.githubusercontent.com上,如果 不修改一下hosts,许多文件很可能会下载失败。
打开cmake-gui后选择源文件路径和MakeFiles保存路径(自选路径),如图:
sourcecode指的是你下载的opencv源码,第二个是你要将编译以后的代码放置的路径,可以自己创建
然后再在compilers中选择 c和c++的编译器 ,c选择gcc, c++选择 g++
执行过程中消息框会出现一堆红色信息,最后显示Configure done,是正常的。如果执行时中断,则存在其他问题。在执行完后,勾选BUILD_opencv_world,WITH_OPENGL和BUILD_EXAMPLES,不勾选WITH_IPP、WITH_MSMF和ENABLE_PRECOMPILED_HEADERS(如果有的话),CPU_DISPATCH选空。如果要编译opencv_contrib,则需要在OPENCV_EXTRA_MODULES_PATH 把路径选择为解压的opencv_contrib文件中的“modules”文件夹。
再次点击Configure,这次执行完后仍有错误如下:
也就是说前面虽然修改了hosts,但是有些文件仍然没有成功下载,解决的方法就是手动下载它们。可以用浏览器访问下载链接,或者使用迅雷等下载器进行下载。CMakeDownloadLog.txt文件中列出了所有丢失文件的下载链接,比如:
https://raw.githubusercontent.com/opencv/opencv_3rdparty/759a23e24ab787a0979f8a93103dcc3105ec10c1/ffmpeg/opencv_ffmpeg.dll
一个个访问这些链接,下载后放到OpenCV源文件里.cache的相应子文件夹中替代原缓存文件(下载的文件重命名为相应地缓存文件名并删除原缓存文件)。这样从头到尾下载CMakeDownloadLog.txt中列出的所有丢失文件,之后,再次Configure,理论上不会出现红色的错误消息了。然后点击Generate,正常的话会显示非红色的消息Generate Done。
此处可能发生的问题就是你顺着这个链接去找源文件,但是打不开这个网站,此处推荐一个网站,GitHub Proxy 代理加速, 点进去以后就可以直接使用,此处需注意:
注意:
1. https://raw.githubusercontent.com/opencv/opencv_3rdparty/759a23e24ab787a0979f8a93103dcc3105ec10c1/ffmpeg/ffmpeg_version.cmake" 无法直接下载,
而是直接打开了ffmpeg_version.cmake,可以右键网页选择另存为 ffmpeg_version.cmake.txt,然后再改为ffmpeg_version.cmake。这里如果自己新建一个txt,然后直接将网页上的内容拷进去,然后再改后缀为.cmake是不行的,会提示md5不匹配。(我的建议是另存为后,用VS打开之前是空的对应文件,然后用VS打开另存为的文件,将另存为的文件内容直接复制给空文件,保存空文件,这样文件的属性不会改变)
2、不同版本的OpenCV对应的 opencv_ffmpeg.dll 等缺失文件的 md5 签名是不一样的(可以直接重新命名为原来空文件的名字)
3.编译opencv
CMD到MakeFiles所在文件夹,执行minGW32-make命令,或者使用多线程minGW32-make -j 4命令:
编译完成后记得输入minGW32-make install完成装载,这样才会生成Install文件夹。
4.调配三大json文件
launch.json
"version": "0.2.0",
"configurations": [
{
"name": "opencv3.4.2 debuge",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"miDebuggerPath": "D:/enviroment/mingw/mingw64/bin/gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": false
}
],
"preLaunchTask": "opencv3.4.2 compile task"
},
{
"type": "node",
"request": "launch",
"name": "启动程序",
"skipFiles": [
"/**"
],
"program": "${file}"
}
]
}
cpp_properties.json
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**",
"D:/code/cppyolov5/opencvs/opencv/build/x64/mingw/install/include",
"D:/code/cppyolov5/opencvs/opencv/build/x64/mingw/install/include/opencv2"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.17763.0",
"compilerPath": "D:/enviroment/mingw/mingw64/bin/gcc.exe",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "clang-x64"
}
],
"version": 4
tasks.j
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "opencv3.4.2 compile task",
"command": "D:\\enviroment\\mingw\\mingw64\\bin\\g++.exe",
"args": [
"-g",
"${fileDirname}\\*.cpp",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe",
"D:\\code\\cppyolov5\\opencvs\\opencv\\build\\x64\\mingw\\bin\\libopencv_world453.dll",
"-I",
"D:/code/cppyolov5/opencvs/opencv/build/x64/mingw/install/include",
"-I",
"D:/code/cppyolov5/opencvs/opencv/build/x64/mingw/install/include/opencv2"
],
"options": {
"cwd": "D:\\enviroment\\mingw\\mingw64\\bin"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "编译器: D:\\enviroment\\qt\\Tools\\mingw730_64\\bin\\cpp.exe"
},
{
"type": "cppbuild",
"label": "C/C++: g++.exe 生成活动文件",
"command": "D:\\enviroment\\qt\\Tools\\mingw730_64\\bin\\g++.exe",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
]
}
最后再使用ctrl + shift + b 运行对应的exe文件